1. 程式人生 > 實用技巧 >Asp.net Core啟動流程講解(一)

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

分享一個公眾號,關注學習/分享的