ASP.NET Core筆記(1) - 瞭解Startup類

  • Startup構造函數
  • ConfigureServices方法
  • Configure方法
  • 在ConfigureWebHostDefaults中直接配置服務和請求管道

ASP.NET Core通常使用Startup類來進行應用的配置。在構建應用主機時指定Startup類,一般經過在主機生成器上調用WebHostBuilderExtensions.UseStartup 方法來指定 Startup類: web

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.UseStartup<Startup>();
        });

Startup類中能夠包含如下方法:app

  • Startup構造函數
  • ConfigureServices方法,可選
  • Configure方法

Startup構造函數

在3.1中,使用泛型主機 (IHostBuilder) 時,Startup構造函數中只能注入這三種類型的服務:IWebHostEnvironment、IHostEnvironment、IConfiguration。
嘗試注入別的服務時會拋出InvalidOperationException異常。async

System.InvalidOperationException: 'Unable to resolve service for type '***' while attempting to activate '_1_Startup.Startup'.'

由於主機啓動時,執行順序爲Startup構造函數 -> ConfigureServices方法 -> Configure 方法。在Startup構造函數執行時主機只提供了這三個服務,別的服務須要在ConfigureServices方法中添加。而後到了Configure方法執行的時候,就可使用更多的服務類型了。函數

ConfigureServices方法

主機會調用ConfigureServices方法,將須要的服務以依賴注入的方式添加到服務容器,使其在Configure方法和整個應用中可用。ui

ConfigureServices方法的參數中沒法注入除IServiceCollection以外的服務。
具體使用時能夠經過IServiceCollection的擴展方法爲應用配置各類功能。code

public void ConfigureServices(IServiceCollection services)
{

    services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlServer(
            Configuration.GetConnectionString("DefaultConnection")));
    services.AddDefaultIdentity<IdentityUser>(
        options => options.SignIn.RequireConfirmedAccount = true)
        .AddEntityFrameworkStores<ApplicationDbContext>();

    services.AddRazorPages();
}

Configure方法

Configure 方法用於指定應用響應 HTTP 請求的方式。 可經過將中間件組件添加到 IApplicationBuilder 實例來配置請求管道。 Configure 方法參數中的IApplicationBuilder不須要在服務容器中註冊就可以使用,它已由主機建立好並直接傳遞給了Configure方法。
Configure方法由一系列的Use擴展方法組成:中間件

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }

    app.UseRouting();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapGet("/", async context =>
        {
            await context.Response.WriteAsync("Hello World!");
        });
    });
}

每一個Use擴展都在請求管道中添加了中間件。配置到請求管道中的中間件都會調用它以後的下一個中間件或者直接將管道短路。string

在Configure方法參數中,能夠根據本身的須要注入像IWebHostEnvironment, ILoggerFactory之類的服務,或者是在ConfigureServices方法中添加到DI容器中的服務。it

在ConfigureWebHostDefaults中直接配置服務和請求管道

ASP.NET Core還提供了不使用Startup類而可以配置服務和請求管道的方式。也能夠在ConfigureWebHostDefaults上調用它提供的ConfigureServices和Configure方法。io

public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureAppConfiguration((hostingContext, config) =>
            {
            })
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.ConfigureServices((c, services) =>
                {
                    services.AddControllers();
                })
                .Configure(app =>
                {
                    var env = app.ApplicationServices.GetRequiredService<IWebHostEnvironment>();

                    if (env.IsDevelopment())
                    {
                        app.UseDeveloperExceptionPage();
                    }

                    app.UseRouting();

                    app.UseEndpoints(endpoints =>
                    {
                        endpoints.MapGet("/", async context =>
                        {
                            await context.Response.WriteAsync("Hello World!");
                        });
                    });
                });
            })
相關文章
相關標籤/搜索