本文转载自微信公众号“老王加”,老王加作者老王。转载本文请联系老王Plus公众号。前几天,我审查了一个项目的代码,发现有些人会在很基础的内容上出错。今天就这一点,写一下DotnetCore的主要项目结构类型,以及它们之间的转换和演化。1.最基础的应用Console控制台应用是DotnetCore乃至之前的DotnetFramework中最基础的项目。我们新建一个Console工程看看:%dotnetnewconsole-odemo创建完成后,打开工程。项目中只有一个文件Program.cs,只有一个方法Main:namespacedemo{classProgram{staticvoidMain(string[]args){Console.WriteLine("HelloWorld!");}}}在所有类型的Dotnet中核心项目,Program.cs是初始入口,main方法也是初始入口方法。在这个项目中,还有一个文件需要了解一下,demo.csproj,就是这个项目的定义文件:Exenet5.0这里OutputType告诉编辑器这个项目编译后可以直接执行,TargetFramework定义了运行框架。注意这个框架字符串有一个对照表:net5.0对应.Net5.0;如果要使用DotnetCore3.1,对应的字符串是netcoreapp3.1,不是net3.1。准确的说,3.1是.NetCore3.1,5.0是.Net5.0。不用太担心,这只是微软的命名规则。这是控制台应用程序控制台的初始状态。接下来,让我们看看这个项目是如何转化为一个Web应用程序的。2.转换为Web应用程序我们需要做的第一件事是更改demo.csproj项目定义文件。Web应用程序运行在WebHost上,而不是直接从中执行。因此,我们需要删除OutputType项。另外,SDK也需要改动。我们在Console中使用Microsoft.NET.Sdk,将web应用改为Microsoft.NET.Sdk.Web:net5.0修改后保存。这个时候你应该能注意到项目发生了变化:依赖的框架从Microsoft.NETCore.App变成了两个,多了一个Microsoft.AspNetCore.App,说明现在这是一个Asp.net核心应用;项目中自动生成一个目录Properties,在下面添加一个文件launchSettings.json。这个文件大家应该都不陌生,我就不解释了。这个时候应用已经从Console变成了Webapplication。Asp.NetCore框架提供了一个Host用于web加载。我们需要做的就是将主机生成器添加到程序中。通常,我们需要两个构建器:GenerichostbuilderWebhostWebhostbuilder1。配置通用主机Microsoft.Extensions.Hosting.Host中的通用主机主要为Web应用提供以下功能:依赖注入日志配置IConfigurationIHostedService实现添加通用主机很简单,只需要一个方法CreateDefaultBuilder:classProgram{staticvoidMain(string[]args){Host.CreateDefaultBuilder(args).Build().Run();}}2.配置Web主机Web主机是真正的Web主机相关内容,主要实现:Http支持设置Kestrol服务器添加IIS对web服务器加入web主机的支持,也是一个方法ConfigureWebHostDefaults:classProgram{staticvoidMain(string[]args){Host.CreateDefaultBuilder(args).ConfigureWebHostDefaults(webBuilder=>{}).Build().Run();}}该方法用于添加Http请求管道,注入我们需要的服务。而注入我们需要的服务就是我们最常用的Startup.cs的内容。接下来我们先在前面的ConfigureWebHostDefaults中创建Startup.cs,namespacedemo{publicclassStartup{}},添加Startup,完成代码:classProgram{staticvoidMain(string[]args){Host.CreateDefaultBuilder(args).ConfigureWebHostDefaults(webBuilder=>{webBuilder.UseStartup();}).Build().Run();}}这是Program.cs中的完整代码。整理一下,就是我们平时看到的:publicclassProgram{publicstaticvoidMain(string[]args){CreateHostBuilder(args).Build().Run();}publicstaticIHostBuilderCreateHostBuilder(string[]args)=>Host.CreateDefaultBuilder(args)。ConfigureWebHostDefaults(webBuilder=>{webBuilder.UseStartup();});}然而,它在这里不能正常工作,因为Startup.cs仍然是空的。3、完成Startup类Startup类在Asp.netCore应用中扮演着重要的角色。该类用于:使用DI容器注入服务搭建HttpRequest管道插入中间件。下面我们完成需要的方法:namespacedemo{publicclassStartup{publicvoidConfigureServices(IServiceCollectionservices){}publicvoidConfigure(IApplicationBuilderapp,IWebHostEnvironmentenv){}}}运行,到这里,web应用就可以正常启动了。4.给应用添加路由web应用启动,但是里面什么都没有,是空的。要访问Web应用程序中的任何资源,需要配置路由。这里的路由基本上就是传入的Http请求和资源之间的映射。我们可以使用下面的中间件来启动路由:UseRoutingUseEndpoints添加试试:publicvoidConfigure(IApplicationBuilderapp,IWebHostEnvironmentenv){app.UseRouting();app.UseEndpoints(endpoint=>{endpoint.MapGet("/",asynccontext=>{awaitcontext.Response.WriteAsync("HellofromDemo");});});}这一次,浏览器将看到正确的输出。我们可以使用MapGet映射更多资源:");});endpoint.MapGet("/test",asynccontext=>{awaitcontext.Response.WriteAsync("HellofromDemo.Test");});endpoint.MapGet("/about",asynccontext=>{awaitcontext.Response.WriteAsync("HellofromDemo.About");});});}到这里,我们已经成功地将Console应用程序转换为Web应用程序。3.扩展内容以上完成的Web应用是Web应用的基础。基于这些内容,我们还可以扩展到其他项目结构。1、改成MVC应用需要在ConfigureServices中注入AddControllersWithViews,在Configure中添加MapDefaultControllerRoute:app.Useapp.Used;(endpoint=>{endpoint.MapDefaultControllerRoute();});}}2.更改为WebAPI应用程序,需要注入AddControllers和MapControllers:){app.UseRouting();app.UseEndpoints(endpoint=>{endpoint.MapControllers();});}}3.更改为Razor应用程序,需要注入AddRazorPages和MapRazorPages:publicclassStartup{publicvoidConfigureServices(IServiceCollectionservices){services.AddRazorPages();}publicvoidConfigure(IApplicationBuilderapp,IWebHostEnvironmentenv){app.UseRouting();app.UseEndpoints(endpoint=>{endpoint.MapRazorPages();});}}四、总结一下,其实这个过程非常简单。通过这种方式,可以进一步了解DotnetCore的项目结构和应用程序的运行过程。希望对大家有所帮助。?本文的支持代码在:https://github.com/humornif/Demo-Code/tree/master/0038/demo