1.引言
啟動(dòng)類默認(rèn)命名為Startup,它是在程序入口函數(shù)中為了構(gòu)造IWebHost時(shí)通過UseStartup<Startup>()
指定的误墓。主要是定義了兩個(gè)方法ConfigureService
和Configure
方法领猾。應(yīng)用程序啟動(dòng)時(shí)根據(jù)UseStartup
方法指定的Startup
類或程序集用狱,借助StartupLoader
進(jìn)行反射調(diào)用,以完成依賴服務(wù)注冊和中間件注冊,以構(gòu)造完整的HTTP請求管道已慢。
下面我們就結(jié)合MVC模板項(xiàng)目中的Startup類來探討下其簡單用法座掘。
2. 約定方法
我們知道啟動(dòng)類中主要包含了ConfigureService
和Configure
兩個(gè)方法递惋。
2.1. ConfigureService
該方法一般用于配置服務(wù)將服務(wù)注冊到依賴注入容器中,在Configure
方法之前被調(diào)用溢陪。通過調(diào)用IServiceCollection
的擴(kuò)展方法進(jìn)行服務(wù)注冊萍虽。擴(kuò)展方法的命名建議按照Add[MethodName]進(jìn)行約定,比如Mvc相關(guān)服務(wù)的注冊services.AddMvc()
形真。
除此之外杉编,我們還可以在此方法中替換ASP.NET Core默認(rèn)內(nèi)置的依賴注入框架。比如我們使用Castle Windsor替換:
- 安裝Castle.Windsor.MsDependencyInjection NuGet包;
- 修改方法返回值類型為
IServiceProvider
王财; - 替換依賴容器:
public IServiceProvider ConfigureServices(IServiceCollection services)
{
services.AddMvc();
//Add Castle Windsor DI
var ioContainer = new WindsorContainer();
return WindsorRegistrationHelper.CreateServiceProvider(ioContainer, services);
}
2.2. Configure
該方法用于定義應(yīng)用程序如何響應(yīng)每個(gè)HTTP請求卵迂,以及配置HTTP流水線中的中間件。
public void Configure(IApplicationBuilder app)
{
app.UseMvc(); //使用MVC框架去處理用戶請求
//添加一個(gè)終端中間件委托到應(yīng)用程序請求管道
app.Run( context => {
return context.Response.WriteAsync("Hello ASP.NET Core绒净!");
});
}
該方法接受IApplicationBuilder
作為參數(shù)见咒,同時(shí)可以接受一些可選參數(shù),如IHostingEnvironment
和ILoggerFactory
挂疆。而且改览,在ConfigureServices
方法中注冊的其他服務(wù),也可以直接在該方法中通過參數(shù)直接注入使用缤言,比如:
public void ConfigureServices(IServiceCollection services)
{
services.AddScoped<ITestService, TestService>();
}
public void Configure(IApplicationBuilder app,ITestService testService)
{
testService.Test();
}
因?yàn)樵摲椒ㄓ糜谂渲谜麄€(gè)http請求管道宝当,所以中間件的注冊要注意順序。同樣胆萧,在配置中間件時(shí)庆揩,我們同樣建議遵循Use[Middleware]的命名約定,比如啟用Mvc中間件app.UseMvc
跌穗。
3. 可用服務(wù)
從上節(jié)我們就已經(jīng)知道订晌,ASP.NET Core在調(diào)用之前已經(jīng)默認(rèn)注入了以下幾個(gè)可用服務(wù):
- IConfiguration:用于讀取應(yīng)用程序配置。
- IServiceCollection:可以理解為ASP.NET Core內(nèi)置的依賴注入容器蚌吸。
- IApplicationBuilder:用于構(gòu)建應(yīng)用程序的請求管道锈拨。
- IHostingEnvironment :提供了當(dāng)前應(yīng)用程序的運(yùn)行的宿主環(huán)境配置信息。
除此之外羹唠,我們還可以使用已經(jīng)注入的IServiceProvider
奕枢、ILoggerFactory
、ILogger
佩微、IApplicationLifetime
等可用服務(wù)缝彬。這些預(yù)置服務(wù)可以注入到Startup類的構(gòu)造函數(shù)或Configure
方中。就像這樣:
public void Configure(IApplicationBuilder app, IHostingEnvironment env,
ILoggerFactory loggerFactory)
{
loggerFactory.AddDebug();
}
ConfigureServices
只支持一個(gè)參數(shù)IServiceCollection
喊衫,因?yàn)樗械囊蕾嚩伎梢酝ㄟ^IServiceCollection
獲取跌造,所以沒有必要通過方法再注入其他服務(wù),可以直接通過以下方式解析依賴的服務(wù):
public void ConfigureServices(IServiceCollection services)
{
var serveiceProvider = services.BuildServiceProvider();
var logger =serveiceProvider.GetService<ILogger>();
//....
}
4. 定義多個(gè)啟動(dòng)類
我們看下Configure
方法我們發(fā)現(xiàn)族购,通過IHostingEnvironment
服務(wù)壳贪,我們可以獲取當(dāng)前應(yīng)用程序的運(yùn)行環(huán)境。代碼中為開發(fā)環(huán)境啟用了異常詳情頁面寝杖、數(shù)據(jù)庫錯(cuò)誤頁面和Brower Link(支持啟動(dòng)多個(gè)web瀏覽器违施,并可同步刷新,一般用于跨瀏覽器測試)瑟幕,以方便我們開發(fā)調(diào)試磕蒲。
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseBrowserLink();
app.UseDatabaseErrorPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
}
//...
}
ASP.NET Core默認(rèn)內(nèi)置了三種環(huán)境變量:Development留潦、 Staging、Production辣往。我們可以為每一種環(huán)境定義一個(gè)啟動(dòng)類兔院,命名為Startup[Environment]即可。在啟動(dòng)時(shí)通過指定啟動(dòng)類所在的程序集名稱即可根據(jù)launchSettings中的配置的ASPNETCORE_ENVIRONMENT
自動(dòng)加載對應(yīng)的啟動(dòng)類站削。
public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup(Assembly.GetExecutingAssembly().FullName)
.Build();