1.引言
啟動類默認命名為Startup,它是在程序入口函數(shù)中為了構造IWebHost時通過UseStartup<Startup>()
指定的。主要是定義了兩個方法ConfigureService
和Configure
方法。應用程序啟動時根據(jù)UseStartup
方法指定的Startup
類或程序集,借助StartupLoader
進行反射調用,以完成依賴服務注冊和中間件注冊,以構造完整的HTTP請求管道。
下面我們就結合MVC模板項目中的Startup類來探討下其簡單用法。
2. 約定方法
我們知道啟動類中主要包含了ConfigureService
和Configure
兩個方法。
2.1. ConfigureService
該方法一般用于配置服務將服務注冊到依賴注入容器中,在Configure
方法之前被調用。通過調用IServiceCollection
的擴展方法進行服務注冊。擴展方法的命名建議按照Add[MethodName]進行約定,比如Mvc相關服務的注冊services.AddMvc()
。
除此之外,我們還可以在此方法中替換ASP.NET Core默認內置的依賴注入框架。比如我們使用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
該方法用于定義應用程序如何響應每個HTTP請求,以及配置HTTP流水線中的中間件。
public void Configure(IApplicationBuilder app)
{
app.UseMvc(); //使用MVC框架去處理用戶請求
//添加一個終端中間件委托到應用程序請求管道
app.Run( context => {
return context.Response.WriteAsync("Hello ASP.NET Core!");
});
}
該方法接受IApplicationBuilder
作為參數(shù),同時可以接受一些可選參數(shù),如IHostingEnvironment
和ILoggerFactory
。而且,在ConfigureServices
方法中注冊的其他服務,也可以直接在該方法中通過參數(shù)直接注入使用,比如:
public void ConfigureServices(IServiceCollection services)
{
services.AddScoped<ITestService, TestService>();
}
public void Configure(IApplicationBuilder app,ITestService testService)
{
testService.Test();
}
因為該方法用于配置整個http請求管道,所以中間件的注冊要注意順序。同樣,在配置中間件時,我們同樣建議遵循Use[Middleware]的命名約定,比如啟用Mvc中間件app.UseMvc
。
3. 可用服務
從上節(jié)我們就已經知道,ASP.NET Core在調用之前已經默認注入了以下幾個可用服務:
- IConfiguration:用于讀取應用程序配置。
- IServiceCollection:可以理解為ASP.NET Core內置的依賴注入容器。
- IApplicationBuilder:用于構建應用程序的請求管道。
- IHostingEnvironment :提供了當前應用程序的運行的宿主環(huán)境配置信息。
除此之外,我們還可以使用已經注入的IServiceProvider
、ILoggerFactory
、ILogger
、IApplicationLifetime
等可用服務。這些預置服務可以注入到Startup類的構造函數(shù)或Configure
方中。就像這樣:
public void Configure(IApplicationBuilder app, IHostingEnvironment env,
ILoggerFactory loggerFactory)
{
loggerFactory.AddDebug();
}
ConfigureServices
只支持一個參數(shù)IServiceCollection
,因為所有的依賴都可以通過IServiceCollection
獲取,所以沒有必要通過方法再注入其他服務,可以直接通過以下方式解析依賴的服務:
public void ConfigureServices(IServiceCollection services)
{
var serveiceProvider = services.BuildServiceProvider();
var logger =serveiceProvider.GetService<ILogger>();
//....
}
4. 定義多個啟動類
我們看下Configure
方法我們發(fā)現(xiàn),通過IHostingEnvironment
服務,我們可以獲取當前應用程序的運行環(huán)境。代碼中為開發(fā)環(huán)境啟用了異常詳情頁面、數(shù)據(jù)庫錯誤頁面和Brower Link(支持啟動多個web瀏覽器,并可同步刷新,一般用于跨瀏覽器測試),以方便我們開發(fā)調試。
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseBrowserLink();
app.UseDatabaseErrorPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
}
//...
}
ASP.NET Core默認內置了三種環(huán)境變量:Development、 Staging、Production。我們可以為每一種環(huán)境定義一個啟動類,命名為Startup[Environment]即可。在啟動時通過指定啟動類所在的程序集名稱即可根據(jù)launchSettings中的配置的ASPNETCORE_ENVIRONMENT
自動加載對應的啟動類。
public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup(Assembly.GetExecutingAssembly().FullName)
.Build();