.NET Core中Startup詳解

.NET Core中Startup詳解

  • Startup構造函數
  • ConfigureServices方法
  • Configure方法
  • 在ConfigureWebHostDefaults中直接配置服務和請求管道
  • ASP.NET Core一般使用Startup類來進行應用的配置。在構建應用主機時指定Startup類,通常通過在主機生成器上調用WebHostBuilderExtensions.UseStartup 方法來指定 Startup類:

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

    Startup類中可以包含以下方法:

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

    Startup構造函數

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

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

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

    ConfigureServices方法

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

    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();
    }/<applicationdbcontext>/<identityuser>/<applicationdbcontext>/<code>

    Configure方法

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

    <code>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!");
    });
    });
    }/<code>

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

    在Configure方法參數中,可以根據自己的需要注入像IWebHostEnvironment, ILoggerFactory之類的服務,或者是在ConfigureServices方法中添加到DI容器中的服務。

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

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

    <code>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!");
    });
    });
    });
    })/<iwebhostenvironment>/<code>
    .NET Core中Startup詳解


    分享到:


    相關文章: