Startup
類別是 Web 應用程式的進入點,可以在這個類別中設定應用程式要使用的服務和處理請求的 pipeline。
一般習慣會將啟動類別命名為 Startup
,如果用了別的名稱,記得在 Main
方法呼叫 UseStartup
時換成自己定義的啟動類別。
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<YourStartupClass>();
啟動類別通常包含兩個方法:
ConfigureServices
:用來設定應用程式的服務,不一定要有。Configure
:用來建立應用處理請求的 pipeline。應用程式啟動時,runtime 會嘗試呼叫這兩個方法。
Startup
類別的建構元中,也可以透過依賴注入來加入其他服務,常用的幾個服務是:
IConfiguration
:讀取設定,透過 MVC 範本建立的專案預設有加入。IHostingEnvironment
:可以根據不同的環境來設定服務。ILoggerFactory
:在 Startup.ConfigureServices
中建立日誌記錄器。public class Startup
{
private readonly IHostingEnvironment _env;
private readonly IConfiguration _config;
private readonly ILoggerFactory _loggerFactory;
public Startup(IHostingEnvironment env, IConfiguration config,
ILoggerFactory loggerFactory)
{
_env = env;
_config = config;
_loggerFactory = loggerFactory;
}
public void ConfigureServices(IServiceCollection services)
{
var logger = _loggerFactory.CreateLogger<Startup>();
if (_env.IsDevelopment())
{
// 開發環境服務設定
logger.LogInformation("Development environment");
}
else
{
// 非開發環境服務設定
logger.LogInformation($"Environment: {_env.EnvironmentName}");
}
// Configuration is available during startup.
// Examples:
// _config["key"]
// _config["subsection:suboption1"]
}
}
注入 IHostingEnvironment
的作法,也可以透過定義不同環境所使用的 Startup
類別來取代,runtime 會自動選擇符合當前環境的類別。名稱結尾符合當前環境的類別會優先被使用。例如在開發環境時,同時包含 Startup
和 StartupDevelopment
類別,會使用後者來做為啟動類別。詳細的說明可以參考第十一天。
Configure
方法前被呼叫,用來設定應用程式的服務。常見的模式是先呼叫所有的 Add{Service}
方法,再呼叫 services.Configure{Service}
方法。
在此方法中將服務加入服務容器後,便可以在應用程式和 Configure
方法中使用,這些服務會透過依賴注入或 IApplicationBuilder.ApplicationServices
來解析。
對於需要大量設定的功能,IServiceCollection
提供不同的 Add{Service}
方法供使用。包含 Entity Framework、Identity、和 MVC 的 Web 應用程式中,在 ConfigureServices
方法中通常會加入這些服務:
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(_config.GetConnectionString("DefaultConnection")));
services.AddIdentity<ApplicationUser, IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
services.AddMvc();
}
用來定義應用程式該如何回應 HTTP 請求。此方法接受一個 IApplicationBuilder
參數,透過將中介層新增到 IApplicationBuilder
實體中來設定請求 pipeline。
public void Configure(IApplicationBuilder app)
{
if (_env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseCookiePolicy();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
每個 Use
方法都會將中介層加入請求 pipeline 中。例如 UseMvc
方法會加入路由中介層,同時把 MVC 設為預設的處理常式。