一個(gè)ASP.NET Core應(yīng)用被啟動(dòng)之后就具有了針對(duì)請(qǐng)求的處理能力,而這個(gè)能力是由管道賦予的,所以應(yīng)用的啟動(dòng)同時(shí)意味著管道的成功構(gòu)建。由于管道是由注冊(cè)的服務(wù)器和若干中間件構(gòu)成的,所以應(yīng)用啟動(dòng)過(guò)程中一個(gè)核心的工作就是完成中間節(jié)的注冊(cè)。由于依賴注入在ASP.NET Core應(yīng)用這得到非常廣泛的應(yīng)用,框架絕大部分的工作都會(huì)分配給我們預(yù)先注冊(cè)的服務(wù),所以服務(wù)注冊(cè)也是啟動(dòng)WebHost過(guò)程的另一項(xiàng)核心工作。這兩項(xiàng)在啟動(dòng)過(guò)程中必須完成的核心工作通過(guò)一個(gè)名為Startup的對(duì)象來(lái)承載。 [本文已經(jīng)同步到《ASP.NET Core框架揭秘》之中]
目錄
一、 DelegateStartup
二、ConventionBasedStartup
StartupMethods
StartupLoader
如何選擇啟動(dòng)類型
如何選擇服務(wù)注冊(cè)方法和中間件注冊(cè)方法
StartupMethods對(duì)象的創(chuàng)建
UseStartup方法究竟做了些什么?
三、選擇哪一個(gè)Startup
這里所謂的Startup實(shí)際上是對(duì)所有實(shí)現(xiàn)了IStartup接口的所有類型以及對(duì)應(yīng)對(duì)象的統(tǒng)稱。如下面的代碼片段所示,服務(wù)注冊(cè)由ConfigureServices方法來(lái)實(shí)現(xiàn),它返回一個(gè)ServiceProvider對(duì)象,至于另一個(gè)方法Configure則負(fù)責(zé)完成中間件的注冊(cè),方法輸入?yún)?shù)是一個(gè)ApplicationBuilder對(duì)象。
1: public interface IStartup
2: {
3: IServiceProvider ConfigureServices(IServiceCollection services);
4: void Configure(IApplicationBuilder app);
5: }
IStartup接口所在的NuGet包中還定義了另一個(gè)實(shí)現(xiàn)了這個(gè)接口的抽象類StartupBase。如下面的代碼片段所示,StartupBase實(shí)現(xiàn)了抽象方法ConfigureServices,該方法直接利用提供的ServiceCollection對(duì)象創(chuàng)建返回的ServiceProvider。換句話說(shuō),派生于StartupBase的Startup類型如果沒(méi)用重寫ConfigureServices方法,它們實(shí)際上只關(guān)心中間件的注冊(cè),而不需要注冊(cè)額外的服務(wù)。