iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 6
1
Modern Web

.Net Core 網站開發 101系列 第 6

Startup 啟動類別

Startup 類別是 Web 應用程式的進入點,可以在這個類別中設定應用程式要使用的服務和處理請求的 pipeline。

Startup 類別

一般習慣會將啟動類別命名為 Startup,如果用了別的名稱,記得在 Main 方法呼叫 UseStartup 時換成自己定義的啟動類別。

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .UseStartup<YourStartupClass>();

啟動類別通常包含兩個方法:

  • ConfigureServices:用來設定應用程式的服務,不一定要有。
  • Configure:用來建立應用處理請求的 pipeline。

應用程式啟動時,runtime 會嘗試呼叫這兩個方法。

Startup 類別的建構元中,也可以透過依賴注入來加入其他服務,常用的幾個服務是:

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 會自動選擇符合當前環境的類別。名稱結尾符合當前環境的類別會優先被使用。例如在開發環境時,同時包含 StartupStartupDevelopment 類別,會使用後者來做為啟動類別。詳細的說明可以參考第十一天。

ConfigureSerivces 方法

  • 可以不定義。
  • 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();
}

Configure 方法

用來定義應用程式該如何回應 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 設為預設的處理常式。

參考資料


上一篇
ASP.NET Core 網頁應用程式結構
下一篇
Dependency Injection 依賴注入
系列文
.Net Core 網站開發 10131

尚未有邦友留言

立即登入留言