ASP.NET Core系列(三):啟動類Startup

章為忠發表於2019-07-23

前面講了ASP.NET Core 的專案結構,檢視完整的ASP.NET Core系列文章:https://www.cnblogs.com/zhangweizhong/category/1477144.html

ASP.NET Core 裡面一個比較重要的就是Startup.cs 類,包括載入配置, 通過依賴注入載入元件, 註冊路由等都在此處進行。今天就來聊一聊Startup 類的作用和用法。

 

與 ASP.NET 對比,ASP.NET Core 最顯著的變化之一就是配置應用程式的方式,Global.asax、FilterConfig.cs 和 RouteConfig.cs 統統消失了,取而代之的是 Program.cs 和 Startup.cs。Program.cs 作為 Web 應用程式的預設入口,會自動呼叫Startup.cs 中的 ConfigureServices 方法 和 Configure 方法。大致流程如下圖所示:
 

Startup 類

Startup 類是配置服務和應用的請求管道。

Startup 類的作用:

  1. ConfigureServices方法用於定義(註冊)應用程式所使用的服務。(如:ASP.NET Core MVC,Entity Framework Core,Identity 等);

  2. Configure方法用於定義請求管道的中介軟體,該管道將用於處理應用程式的所有請求。

  3. 註冊服務新增方法是無序的,ASP.NET Core在應用程式啟動的時候,只要有相應服務即可,而註冊中介軟體時方法是有序的,管道內的每一個元件都可以選擇是否將請求交給下一個元件,並在管道中呼叫下一個元件之前或之後執行某些操作。

 

在應用啟動時,ASP.NET Core 執行時會呼叫 ConfigureServices 和 Configure:

public class Startup
{
  // 執行時呼叫此方法。使用此方法向容器新增服務。
  public void ConfigureServices(IServiceCollection services)
  {
    //使用此方法向容器新增服務。
  }
  // 執行時呼叫此方法。使用此方法配置HTTP請求管道。
  public void Configure(IApplicationBuilder app, IHostingEnvironment env)
  {
    //使用此方法配置HTTP請求管道中介軟體。
  }
} 

 

Startup 類的建構函式提供註冊config,log,env 等服務:

public class Startup
{
    private readonly IHostingEnvironment _env;
    private readonly IConfiguration _config;
    private readonly ILoggerFactory _loggerFactory;
   //建構函式,載入配置檔案,註冊log等
    public Startup(IHostingEnvironment env, IConfiguration config, 
        ILoggerFactory loggerFactory)
    {
        _env = env;
        _config = config;
        _loggerFactory = loggerFactory;
    }
   ...

}

ConfigureServices 方法

方法是可選的; 但是如果使用的話,它會在WebHost的Configure方法之前被呼叫。 WebHost可能會在呼叫啟動方法之前配置一些服務。 按照慣例,在這個方法中設定配置選項。

對於需要大量設定的功能,在IServiceCollection上新增Add[Service]擴充套件方法。 下面示例將應用程式配置為使用Entity Framework,Identity和MVC的服務:

public void ConfigureServices(IServiceCollection services)
{
    // Add framework services.
    services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

    services.AddIdentity<ApplicationUser, IdentityRole>()
        .AddEntityFrameworkStores<ApplicationDbContext>()
        .AddDefaultTokenProviders();

    services.AddMvc();

    // Add application services.
    services.AddTransient<IEmailSender, AuthMessageSender>();
    services.AddTransient<ISmsSender, AuthMessageSender>();
}

ConfigureServices 將服務新增到服務容器,使其在應用和 Configure 方法中可用

 

Configure 方法

Configure方法用於指定ASP.NET應用程式如何響應HTTP請求。 通過將中介軟體元件新增到由依賴注入提供的IApplicationBuilder例項來配置請求管道。

從下面的例子中,我們使用了幾個擴充套件方法來配置支援:異常頁和異常處理程式, 靜態檔案,  MVC, 和 Identity的管道。

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Error");
        app.UseHsts();
    }

    app.UseHttpsRedirection();
    app.UseStaticFiles();
    app.UseCookiePolicy();

    app.UseMvc();
}

每個 Use 擴充套件方法將一個或多箇中介軟體元件新增到請求管道。 例如,UseMvc 擴充套件方法將路由中介軟體新增到請求管道,並將 MVC 配置為預設處理程式。

其他服務(如 IHostingEnvironment 和 ILoggerFactory),也可以在 Configure 方法中指定

 

 最後

1. 以上就將Startup 類簡單的介紹完了,還有很多高階功能和用法,可以繼續研究研究。
2. 參考文件:https://docs.microsoft.com/en-us/aspnet/core/fundamentals/startup?view=aspnetcore-2.2


相關文章