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

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM