Asp.net Core啟動流程講解(一)
asp.net core預設專案包括
專案根目錄級的Startup.cs、Program.cs、appsettings.json(appsettings.Development.json) launchSettings.json
Controllers資料夾下面的ValuesController.cs
以及啟動配置檔案launchSettings.json
Program.cs
Program.cs 配置程式啟動項以及各類初始化, Asp.net Core 3.0以及以後版本的替換依賴注入就得在Program內配置
.net core 3.0之前的Program.cs
.net core 3.0之後的Program.cs
.net core 3.0之前的Program.cs
.net core 2.2以及之前的版本,控制容器的,主要是WebHost,預設實現也以此為主
在WebHost.CreateDefaultBuilder(args)之後,就可以完成各種對於WebHost的配置,常見的預設函式 UseStartu、UseUrl以及UseConfiguration等。
執行完CreateWebHostBuilder函式後,返回IWebHostBuilder,然後Build->Run專案啟動
.net core 3.0之後的Program.cs
.net core 3.0以及以後,控制容器的,從WebHost變成Host,預設實現也以此為主
在WebHost.CreateDefaultBuilder(args)之後,執行ConfigureWebHostDefaults函式,在函式內就可以完成各種對於WebHost的配置,常見的預設函式 UseStartu、UseUrl以及UseConfiguration等。
執行完CreateWebHostBuilder函式後,返回IWebHostBuilder,然後Build->Run專案啟動
Startup.cs
Startup是Asp.net core啟動程式
Startup啟動過程中預設實現並啟動了IStartup介面和IStartupFilter介面
IStartup是Starup的隱式實現,IStartupFilter是啟動過程中的過濾器,可以完成一些載入在asp.net core管道/中介軟體之前的額外流程
IStartup/Startup
Starup是根據IStartup實現的
public interface IStartup
{
IServiceProvider ConfigureServices(IServiceCollection services);
void Configure(IApplicationBuilder app);
}
ConfigureServices方法只能有一個引數,且引數型別為IServiceCollection,返回值為IServiceProvider
Startup類的ConfigureServices方法,在asp.net core 3.0以及以上,返回值只能為void
Configure方法可以依賴注入多個Singleton/Transient生命週期的服務
IStartupFilter
IStartupFilter是啟動前的過濾器
public interface IStartupFilter
{
Action<IApplicationBuilder> Configure(Action<IApplicationBuilder>
next);
}
在啟動過程中,通過Ioc容器獲取一組IStartupFilter實力,然後列表反轉執行
private RequestDelegate BuildApplication()
{
..
IApplicationBuilder builder = builderFactory.CreateBuilder(Server.Features);
builder.ApplicationServices = _applicationServices;
var startupFilters = _applicationServices.GetService<IEnumerable<IStartupFilter>>();
Action<IApplicationBuilder> configure = _startup.Configure;
foreach (var filter in startupFilters.Reverse())
{
configure = filter.Configure(configure);
}
configure(builder);
return builder.Build();
}
後記
開了一個系列,雜談一下asp.net core的內容,做一下系統性的總結分享。網上不缺乏分享asp.net core細節的,無論是原始碼級,還是應用上的sample,但是缺乏一個系統性的系列。
不自量力,想分享一點。
如果對於內容有交流和學習的,可以加 .Net應用程式框架交流群,群號386092459
分享一個公眾號,關注學習/分享的