環境:
- window 10
- .netcore 3.1
- vs2019 16.5.1
說明:
上一篇介紹到了aspnetcore中的通用主機,這個通用主機封裝了日誌、配置、依賴注入容器等資源,並且裏面包括了一些列的主機服務(IHostedService),而web服務就是其中的一個主機服務。這篇就來分析,aspnetcore是怎樣將web服務(GenericWebHostService)注入到通用主機中的(Host)。
正文:
通過上篇我們知道,通用主機使用的主要步驟如下:
- 1.創建主機構建者對象(HostBuilder)
- 2.將構建邏輯存儲到主機構建者對象中
- 3.調用主機構建者對象的build方法構造出主機對象(Host)
- 4.啓動主機對象Host,Host中的主機服務(IHostedService)也隨着啓動
- 5.關閉主機對象Host,Host中的主機服務(IHostedService)也隨之關閉
接下來我們僅分析負責web的主機服務(主要是Startup.cs的實例化、ConfigureServices和Configure方法的調用時機),先來看下面代碼:
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
在上面代碼中,我們通過.ConfigureWebHostDefaults(...)
將web服務注入進去的,其他的代碼都是針對通用主機的,那麼我們就調試進入這個方法:
通過上圖可以看出,最終我們創建了一個web主機服務的構造者對象(GenericWebHostBuilder),而這個GenericWebHostBuilder其實就是封裝了HostBuilder而已,那麼通過GenericWebHostBuilder注入的處理邏輯也就存儲到了HostBuilder的_configureHostConfigActions 、_configureAppConfigActions 、_configureServicesActions 中,我們看一下GenericWebHostBuilder的構造函數:
通過上圖,我們應該對“GenericWebHostBuilder其實就是封裝了HostBuilder而已”這句話有了直觀的理解了。
我們將上面調試代碼的執行邏輯梳理一下:
從上面圖可以看到,我們在配置的時候就執行了webBuilder.UseStartup<Startup>();
方法,那麼我們深入這個方法看一下:
未完待續。。。