.NET Core 3.0之深入源码理解Startup的注册及运行
開發.NET Core應用,直接映入眼簾的就是Startup類和Program類,它們是.NET Core應用程序的起點。通過使用Startup,可以配置化處理所有向應用程序所做的請求的管道,同時也可以減少.NET應用程序對單一服務器的依賴性,使我們在更大程度上專注于面向多服務器為中心的開發模式。
目錄:
Startup討論
Starup所承擔的角色
Startup編寫規范
ConfigureServices
Configure
擴展Startup方法
深入源碼查看Startup是如何注冊和執行的
UseStartup源碼
創建Startup實例
ConfigureServices和Configure
Starup所承擔的角色
Startup作為一個概念是ASP.NET Core程序中所必須的,Startup類本身可以使用多種修飾符(public、protect,private、internal),作為ASP.NET Core應用程序的入口,它包含與應用程序相關配置的功能或者說是接口。
雖然在程序里我們使用的類名就是Startup,但是需要注意的是,Startup是一個抽象概念,你完全可以名稱成其他的,比如MyAppStartup或者其他的什么名稱,只要你在Program類中啟動你所定義的啟動類即可。
當然如果不想寫Startup,可以在Program類中配置服務和請求處理管道,請參見評論區5樓,非常感謝Emrys耐心而又全面的指正。
以下是基于ASP.NET Core Preview 3模板中提供的寫法:
不管你命名成什么,只要將webBuilder.UseStartup<>()中的泛型類配置成你定義的入口類即可;
Startup編寫規范
下面是ASP.NET Core 3.0 Preview 3模板中Startup的寫法:
通過以上代碼可以知道,Startup類中一般包括
構造函數:通過我們以前的開發經驗,我們可以知道,該構造方法可以包括多個對象
IConfiguration:表示一組鍵/值應用程序配置屬性。
IApplicationBuilder:是一個包含與當前環境相關的屬性和方法的接口。它用于獲取應用程序中的環境變量。
IHostingEnvironment:是一個包含與運行應用程序的Web宿主環境相關信息的接口。使用這個接口方法,我們可以改變應用程序的行為。
ILoggerFactory:是為ASP.NET Core中的日志記錄系統提供配置的接口。它還創建日志系統的實例。
ConfigureServices
Configure
Startup在創建服務時,會執行依賴項注冊服務,以便在應用程序的其它地方使用這些依賴項。ConfigureServices 用于注冊服務,Configure 方法允許我們向HTTP管道添加中間件和服務。這就是ConfigureServices先于Configure 之前調用的原因。
ConfigureServices
該方法時可選的,非強制約束,它主要用于對依賴注入或ApplicationServices在整個應用中的支持,該方法必須是public的,其典型模式是調用所有?Add{Service}?方法,主要場景包括實體框架、認證和 MVC 注冊服務:
Configure
該方法主要用于定義應用程序對每個HTTP請求的響應方式,即我們可以控制ASP.NET管道,還可用于在HTTP管道中配置中間件。請求管道中的每個中間件組件負責調用管道中的下一個組件,或在適當情況下使鏈發生短路。 如果中間件鏈中未發生短路,則每個中間件都有第二次機會在將請求發送到客戶端前處理該請求。
該方法接受IApplicationBuilder作為參數,同時還可以接收其他一些可選參數,如IHostingEnvironment和ILoggerFactory。
一般而言,只要將服務注冊到configureServices方法中時,都可以在該方法中使用。
擴展Startup方法
使用IStartupFilter來對Startup功能進行擴展,在應用的Configure中間件管道的開頭或末尾使用IStartupFilter來配置中間件。IStartupFilter有助于確保當庫在應用請求處理管道的開端或末尾添加中間件的前后運行中間件。
以下是IStartupFilter的源代碼,通過源代碼我們可以知道,該接口有一個Action<IApplicationBuilder>類型,并命名為Configure的方法。由于傳入參數類型和返回類型一樣,這就保證了擴展的傳遞性及順序性,具體的演示代碼,可以參數MSDN
?
此段文字,只是我想深入了解其內部機制而寫的,如果本身也不了解,其實是不影響我們正常編寫.NET Core應用的。
UseStartup源碼
ASP.NET Core通過調用IWebHostBuilder.UseStartup方法,傳入Startup類型,注意開篇就已經說過Startup是一個抽象概念,我們看下源代碼:
?
創建Startup實例
關于ConfigureServices的定義及注冊方式,是在IWebHostBuilder.ConfigureServices實現的,同時可以注意一下25行代碼,向大家說明了多次注冊Startup的ConfigureServices方法時,會合并起來的根源。此處抽象委托用的也非常多。
該類里面還有Build方法,我就不貼出代碼了,只需要知道,主進程在此處開始了。接下來一個比較重要的方法,是BuildCommonServices,它向當前ServiceCollection中添加一些公共框架級服務,以下是部分代碼,具體代碼請查看WebHostBuilder。
?
ConfigureServices和Configure
當WebHost初始化時,框架會去查找相應的方法,這里,我們主要查看源代碼,其中的核心方法是StartupLoader.FindMethods
該方法通過查找對應的方法,由于Startup并未在DI中注冊,所以會調用GetServiceOrCreateInstance創建一個Startup實例,此時構造函數也在此得到解析。
通過一系列的調用,最終到達了ConfigureServicesBuilder.Invoke里面。Invoke方法使用反射來獲取和檢查在Startup類上定義的ConfigureServices方法所需的參數。
最后我們來看一下ConfigureBuilder類,它需要一個Action<IApplicationBuilder>委托變量,其中包含每個IStartupFilter的一組包裝的Configure方法,最后一個是Startup.Configure方法的委托。此時,所調用的配置鏈首先命中的是AutoRequestServicesStartupFilter.Configure方法。并將該委托鏈作為下一個操作,之后會調用ConventionBasedStartup.Configure方法。這將在其本地StartupMethods對象上調用ConfigureDelegate。
Startup.Configure方法會調用ServiceProvider所解析的相應的參數,該方法還可以使用IApplicationBuilder將中間件添加到應用程序管道中。最終的RequestDelegate是從IApplicationBuilder構建并返回的,至此WebHost初始化完成。
原文地址:https://www.cnblogs.com/edison0621/p/10743228.html
.NET社區新聞,深度好文,歡迎訪問公眾號文章匯總?http://www.csharpkit.com?
總結
以上是生活随笔為你收集整理的.NET Core 3.0之深入源码理解Startup的注册及运行的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微软携手红帽,共筑开源新未来
- 下一篇: 时隔两年的重大更新,微软发布.NET F