RELATEED CONSULTING
相關咨詢
選擇下列產品馬上在線溝通
服務時間:9:30-18:00
掃碼咨詢
關閉右側工具欄
深入探究ASP.NET Core Startup初始化問題
  • 作者:admin
  • 發表時間:2020-12-12 07:50
  • 來源:未知

這篇文章主要介紹了深入探究ASP.NET Core Startup初始化問題,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

前言

Startup類相信大家都比較熟悉,在我們使用ASP.NET Core開發過程中經常用到的類,我們通常使用它進行IOC服務注冊,配置中間件信息等。雖然它不是必須的,但是將這些操作統一在Startup中做處理,會在實際開發中帶來許多方便。當我們談起Startup類的時候你有沒有好奇過以下幾點

為何我們自定義的Startup可以正常工作。

我們定義的Startup類中ConfigureServices和Configure只能叫這個名字才能被調用到嗎?

在使用泛型主機(IHostBuilder)時Startup的構造函數,為何只支持注入IWebHostEnvironment、IHostEnvironment、IConfiguration。

ConfigureServices方法為何只能傳遞IServiceCollection實例。

Configure方法的參數為何可以是所有在IServiceCollection注冊服務實例。

在ASP.NET Core結合Autofac使用的時候為何我們添加的ConfigureContainer方法會被調用。

帶著以上幾點疑問,我們將在本篇文章中探索Startup的源碼,來了解Startup初始化過程到底為我們做了些什么。

Startup的另類指定方式

在日常編碼過程中,我們通常使用UseStartup的方式來引入Startup類。但是這并不是唯一的方式,還有一種方式是在配置節點中指定Startup所在的程序集來自動查找Startup類,這個我們可以在GenericWebHostBuilder的構造函數源碼中的找到相關代碼[點擊查看源碼]相信熟悉ASP.Net Core啟動流程的同學對GenericWebHostBuilder這個類都比較了解。ConfigureWebHostDefaults方法中其實調用了ConfigureWebHost方法,ConfigureWebHost方法中實例化了GenericWebHostBuilder對象,啟動流程不是咱們的重點,所以這里只是簡單描述一下。直接找到我們需要的代碼如下所示

//判斷是否配置了StartupAssembly參數
if (!string.IsNullOrEmpty(webHostOptions.StartupAssembly))
{
try
{
//根據你配置的程序集去查找Startup
var startupType = StartupLoader.FindStartupType(webHostOptions.StartupAssembly, webhostContext.HostingEnvironment.EnvironmentName);
UseStartup(startupType, context, services);
}
catch (Exception ex) when (webHostOptions.CaptureStartupErrors)
{
//此處省略代碼省略
}
}

這里我們可以看出來,我們需要配置StartupAssembly對應的程序集,它可以通過StartupLoader的FindStartupType方法加載程序集中對應的類。我們還可以看到它還傳遞了EnvironmentName環境變量,至于它起到了什么作用,我們繼續往下看。

首先我們需要找到webHostOptions.StartupAssembly是如何被初始化的,在WebHostOptions的構造函數中我們找到了StartupAssembly初始化的地方[點擊查看源碼]

(★^O^★)MG夢幻邂逅玩法介绍 福建体育31选7推荐号 星悦广西麻将旧版 四人单机麻将免费版下载 mg冰球突破最大奖图片 福建11选5最新走 快乐十分高手技巧 _澳门百家乐赌场 微乐龙江麻将辅助软件 捕鱼大师的工具箱 时时彩软件终身免费版 吉林快3专家预测大小 东京快乐8官网 亚洲壹号送48彩金 赚钱的游戏排行榜 谁有欢乐麻将微信群1元 优乐江西麻将安卓版