成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

深入淺出Dotnet Core的項(xiàng)目結(jié)構(gòu)變化

開(kāi)發(fā) 項(xiàng)目管理
今天,就著這個(gè)點(diǎn),寫(xiě)一下Dotnet Core的主要類(lèi)型的項(xiàng)目結(jié)構(gòu),以及之間的轉(zhuǎn)換和演化。

 [[375510]]

本文轉(zhuǎn)載自微信公眾號(hào)「老王Plus」,作者老王Plus的老王 。轉(zhuǎn)載本文請(qǐng)聯(lián)系老王Plus公眾號(hào)。

前幾天Review一個(gè)項(xiàng)目的代碼,發(fā)現(xiàn)非常基礎(chǔ)的內(nèi)容,也會(huì)有人理解出錯(cuò)。

今天,就著這個(gè)點(diǎn),寫(xiě)一下Dotnet Core的主要類(lèi)型的項(xiàng)目結(jié)構(gòu),以及之間的轉(zhuǎn)換和演化。

一、最基礎(chǔ)的應(yīng)用Console

控制臺(tái)應(yīng)用,是Dotnet Core乃至前邊的Dotnet Framework中,最基礎(chǔ)的項(xiàng)目。

我們來(lái)創(chuàng)建一個(gè)Console項(xiàng)目看一下:

  1. % dotnet new console -o demo 

創(chuàng)建完成后,打開(kāi)工程。工程里只有一個(gè)文件Program.cs,里面只有一個(gè)方法Main:

  1. namespace demo 
  2.     class Program 
  3.     { 
  4.         static void Main(string[] args) 
  5.         { 
  6.             Console.WriteLine("Hello World!"); 
  7.         } 
  8.     } 

在Dotnet Core所有類(lèi)型的項(xiàng)目中,Program.cs都是最開(kāi)始的入口,main方法,也是最開(kāi)始的入口方法。

這個(gè)工程中,還有一個(gè)文件也需要了解一下,demo.csproj,這是這個(gè)項(xiàng)目的定義文件:

  1. <Project Sdk="Microsoft.NET.Sdk"
  2.  
  3.   <PropertyGroup> 
  4.     <OutputType>Exe</OutputType> 
  5.     <TargetFramework>net5.0</TargetFramework> 
  6.   </PropertyGroup> 
  7.  
  8. </Project> 

這里面,OutputType告訴編輯器這個(gè)工程編譯后可以直接執(zhí)行,TargetFramework定義運(yùn)行的框架。

注意,這個(gè)框架字串有個(gè)對(duì)照表:net5.0對(duì)應(yīng)的是.Net 5.0;如果你想用Dotnet Core 3.1,對(duì)應(yīng)的字符串是netcoreapp3.1,而不是net3.1。準(zhǔn)確的說(shuō),3.1是.Net Core 3.1,而5.0是.Net 5.0。不用太糾結(jié),微軟的命名規(guī)則而已。

這就是控制臺(tái)應(yīng)用Console的初始狀態(tài)。

下面,我們看看這個(gè)工程如何轉(zhuǎn)變?yōu)閃eb應(yīng)用。

二、轉(zhuǎn)為Web應(yīng)用

第一件事,我們需要改動(dòng)demo.csproj項(xiàng)目定義文件。

Web應(yīng)用跑在WebHost上面,而不是從直接執(zhí)行。所以,我們需要把OutputType項(xiàng)去掉。

另外,SDK也需要改一下。Console我們用的是Microsoft.NET.Sdk,Web應(yīng)用要改成Microsoft.NET.Sdk.Web:

  1. <Project Sdk="Microsoft.NET.Sdk.Web"
  2.  
  3.   <PropertyGroup> 
  4.     <TargetFramework>net5.0</TargetFramework> 
  5.   </PropertyGroup> 
  6.  
  7. </Project> 

改完保存。

這時(shí)候,應(yīng)該可以注意到,項(xiàng)目的發(fā)生了變化:

  • 依賴(lài)的框架從Microsoft.NETCore.App變成了兩個(gè),多了一個(gè)Microsoft.AspNetCore.App,表明現(xiàn)在這是一個(gè)Asp.net Core的應(yīng)用;
  • 項(xiàng)目中自動(dòng)生成了一個(gè)目錄Properties,下面多了一個(gè)文件launchSettings.json。這個(gè)文件大家應(yīng)該很熟悉,就不解釋了。

這時(shí)候,應(yīng)用已經(jīng)從Console轉(zhuǎn)為了Web應(yīng)用。

Asp.Net Core框架提供了Host供Web加載。我們需要做的,是把Host構(gòu)建器加到程序中。通常,我們需要兩個(gè)構(gòu)建器:

  • 通用主機(jī) Generic host builder
  • Web主機(jī) Web host builder

1. 配置通用主機(jī)

通用主機(jī)在Microsoft.Extensions.Hosting.Host中,主要給Web應(yīng)用提供以下功能:

  • 依賴(lài)注入
  • 日志
  • 配置 IConfiguration
  • IHostedService實(shí)現(xiàn)

加入通用主機(jī)很簡(jiǎn)單,就一個(gè)方法CreateDefaultBuilder:

  1. class Program 
  2.     static void Main(string[] args) 
  3.     { 
  4.         Host.CreateDefaultBuilder(args) 
  5.             .Build() 
  6.             .Run(); 
  7.     } 

2. 配置Web主機(jī)

Web主機(jī)才是真正與Web相關(guān)的內(nèi)容,主要實(shí)現(xiàn):

  • Http支持
  • 設(shè)置Kestrol服務(wù)器為Web服務(wù)器
  • 添加IIS支持

加入Web主機(jī),也是一個(gè)方法ConfigureWebHostDefaults:

  1. class Program 
  2.     static void Main(string[] args) 
  3.     { 
  4.         Host.CreateDefaultBuilder(args) 
  5.             .ConfigureWebHostDefaults(webBuilder => 
  6.             { 
  7.             }) 
  8.             .Build() 
  9.             .Run(); 
  10.     } 

這個(gè)方法用來(lái)添加Http請(qǐng)求管道并注入我們需要的服務(wù)。而注入我們需要的服務(wù),就是我們最常見(jiàn)的Startup.cs的內(nèi)容。

下面,我們先創(chuàng)建Startup.cs,

  1. namespace demo 
  2.     public class Startup 
  3.     { 
  4.     } 

在前邊ConfigureWebHostDefaults中,加入Startup,并補(bǔ)齊代碼:

  1. class Program 
  2.     static void Main(string[] args) 
  3.     { 
  4.         Host.CreateDefaultBuilder(args) 
  5.             .ConfigureWebHostDefaults(webBuilder => 
  6.             { 
  7.                 webBuilder.UseStartup<Startup>(); 
  8.             }) 
  9.             .Build() 
  10.             .Run(); 
  11.     } 

這就是Program.cs中的完整代碼了。整理一下,就是我們常見(jiàn)的樣子:

  1. public class Program 
  2.     public static void Main(string[] args) 
  3.     { 
  4.         CreateHostBuilder(args).Build().Run(); 
  5.     } 
  6.  
  7.     public static IHostBuilder CreateHostBuilder(string[] args) => 
  8.         Host.CreateDefaultBuilder(args) 
  9.             .ConfigureWebHostDefaults(webBuilder => 
  10.             { 
  11.                 webBuilder.UseStartup<Startup>(); 
  12.             }); 

不過(guò),到這兒還不能正常運(yùn)行,因?yàn)镾tartup.cs現(xiàn)在還是空的。

3. 補(bǔ)齊Startup類(lèi)

Startup類(lèi)在Asp.net Core應(yīng)用中有著重要的作用。這個(gè)類(lèi)用于:

  • 使用DI容器注入服務(wù)
  • 設(shè)置Http Request管道以插入中間件

下面我們補(bǔ)齊所需的方法:

  1. namespace demo 
  2.     public class Startup 
  3.     { 
  4.         public void ConfigureServices(IServiceCollection services) 
  5.         { 
  6.         } 
  7.         public void Configure(IApplicationBuilder app, IWebHostEnvironment env) 
  8.         { 
  9.         } 
  10.     } 

運(yùn)行,到這兒,Web應(yīng)用已經(jīng)可以正常啟動(dòng)了。

4. 給應(yīng)用添加路由

Web應(yīng)用啟動(dòng)了,但里面什么也沒(méi)有,是空的。

要訪問(wèn)Web應(yīng)用中的任何資源,需要配置路由。這兒的路由,基本上就是傳入Http請(qǐng)求與資源之間的映射。

我們可以用下面的中間件來(lái)啟動(dòng)路由:

  • UseRouting
  • UseEndpoints

加一下試試:

  1. public void Configure(IApplicationBuilder app, IWebHostEnvironment env) 
  2.     app.UseRouting(); 
  3.     app.UseEndpoints(endpoint => { 
  4.         endpoint.MapGet("/", async context => 
  5.         { 
  6.             await context.Response.WriteAsync("Hello from Demo"); 
  7.         }); 
  8.     }); 

這次運(yùn)行,瀏覽器中就看到正確的輸出了。

我們可以用MapGet映射更多資源:

  1. public void Configure(IApplicationBuilder app, IWebHostEnvironment env) 
  2.     app.UseRouting(); 
  3.     app.UseEndpoints(endpoint => 
  4.     { 
  5.         endpoint.MapGet("/", async context => 
  6.         { 
  7.             await context.Response.WriteAsync("Hello from Demo"); 
  8.         }); 
  9.         endpoint.MapGet("/test", async context => 
  10.         { 
  11.             await context.Response.WriteAsync("Hello from Demo.Test"); 
  12.         }); 
  13.         endpoint.MapGet("/about", async context => 
  14.         { 
  15.             await context.Response.WriteAsync("Hello from Demo.About"); 
  16.         }); 
  17.     }); 

到這兒,我們成功地把Console應(yīng)用轉(zhuǎn)為了Web應(yīng)用。

三、延伸內(nèi)容

上面完成的Web應(yīng)用,算是Web應(yīng)用中的基礎(chǔ)。基于這個(gè)內(nèi)容,我們還可以擴(kuò)展到別的項(xiàng)目結(jié)構(gòu)。

1. 改為MVC應(yīng)用

需要在ConfigureServices中注入AddControllersWithViews,并在Configure中添加MapDefaultControllerRoute:

  1. public class Startup 
  2.     public void ConfigureServices(IServiceCollection services) 
  3.     { 
  4.         services.AddControllersWithViews(); 
  5.     } 
  6.     public void Configure(IApplicationBuilder app, IWebHostEnvironment env) 
  7.     { 
  8.         app.UseRouting(); 
  9.         app.UseEndpoints(endpoint => 
  10.         { 
  11.             endpoint.MapDefaultControllerRoute(); 
  12.         }); 
  13.     } 

2. 改為WebAPI應(yīng)用

需要注入AddControllers和MapControllers:

  1. public class Startup 
  2.     public void ConfigureServices(IServiceCollection services) 
  3.     { 
  4.         services.AddControllers(); 
  5.     } 
  6.     public void Configure(IApplicationBuilder app, IWebHostEnvironment env) 
  7.     { 
  8.         app.UseRouting(); 
  9.         app.UseEndpoints(endpoint => 
  10.         { 
  11.             endpoint.MapControllers(); 
  12.         }); 
  13.     } 

3. 改為Razor應(yīng)用

需要注入AddRazorPages和MapRazorPages:

  1. public class Startup 
  2.     public void ConfigureServices(IServiceCollection services) 
  3.     { 
  4.         services.AddRazorPages(); 
  5.     } 
  6.     public void Configure(IApplicationBuilder app, IWebHostEnvironment env) 
  7.     { 
  8.         app.UseRouting(); 
  9.         app.UseEndpoints(endpoint => 
  10.         { 
  11.             endpoint.MapRazorPages(); 
  12.         }); 
  13.     } 

四、總結(jié)

看下來(lái),其實(shí)過(guò)程很簡(jiǎn)單。通過(guò)這種方式,能更進(jìn)一步理解Dotnet Core的項(xiàng)目結(jié)構(gòu)以及應(yīng)用的運(yùn)行過(guò)程。

希望對(duì)大家能有所幫助。

?

本文的配套代碼在:https://github.com/humornif/Demo-Code/tree/master/0038/demo

 

責(zé)任編輯:武曉燕 來(lái)源: 老王Plus
相關(guān)推薦

2021-03-16 08:54:35

AQSAbstractQueJava

2011-07-04 10:39:57

Web

2009-11-30 16:46:29

學(xué)習(xí)Linux

2019-11-11 14:51:19

Java數(shù)據(jù)結(jié)構(gòu)Properties

2022-12-02 09:13:28

SeataAT模式

2019-01-07 15:29:07

HadoopYarn架構(gòu)調(diào)度器

2017-07-02 18:04:53

塊加密算法AES算法

2012-05-21 10:06:26

FrameworkCocoa

2021-07-20 15:20:02

FlatBuffers阿里云Java

2022-09-26 09:01:15

語(yǔ)言數(shù)據(jù)JavaScript

2022-01-13 09:38:25

Android架構(gòu)設(shè)計(jì)

2023-03-20 09:48:23

ReactJSX

2019-11-14 09:53:30

Set集合存儲(chǔ)

2009-12-25 15:49:43

Linux rescu

2012-02-21 13:55:45

JavaScript

2022-01-11 07:52:22

CSS 技巧代碼重構(gòu)

2018-11-09 16:24:25

物聯(lián)網(wǎng)云計(jì)算云系統(tǒng)

2022-11-09 08:06:15

GreatSQLMGR模式

2022-10-31 09:00:24

Promise數(shù)組參數(shù)

2019-12-04 10:13:58

Kubernetes存儲(chǔ)Docker
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 亚洲精品丝袜日韩 | 欧美性另类 | 欧美成人免费在线 | 亚洲午夜视频在线观看 | 欧美精品久久 | 久久久精品综合 | 国产精品不卡 | 国产精品乱码一区二三区小蝌蚪 | 男女羞羞视频在线看 | 一级黄色裸片 | 91久久国产精品 | 91免费观看视频 | 99精品欧美一区二区三区综合在线 | 欧美日韩一区二区在线 | 久久国产精品网站 | 四虎影院在线观看av | 欧美日韩精品在线免费观看 | 美日韩免费 | 毛片电影 | 一区二区三区视频在线免费观看 | 夜夜操天天操 | 男人的天堂亚洲 | 欧美 视频| 国产极品粉嫩美女呻吟在线看人 | 免费国产精品久久久久久 | 99免费看 | 日韩国产在线 | 91精品中文字幕一区二区三区 | 亚洲精品福利在线 | 国产成人99久久亚洲综合精品 | 国产一区二区三区四区区 | 亚洲午夜av | 免费国产一区 | 亚洲精品视频网站在线观看 | 亚洲视频免费 | 亚洲网站在线播放 | 6080yy精品一区二区三区 | 国产欧美精品区一区二区三区 | 午夜视频在线免费观看 | 久久伊人精品 | 久久久精品影院 |