ASP.NET Coreノート(1)-Startupクラスについて

4432 ワード

  • Startupコンストラクタ
  • ConfigureServicesメソッド
  • Configureメソッド
  • コンフィギュレーションWebHostDefaultsで直接サービスと要求パイプ
  • を構成する
    ASP.NET Coreは一般的にStartupクラスを使用してアプリケーションの構成を行います.アプリケーションホストの構築時にStartupクラスを指定し、通常はホストジェネレータでWebHostBuilderExtensionsを呼び出す.UseStartupメソッドでは、Startupクラスを指定します.
    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup();
            });
    
    

    Startupクラスには、次の方法があります.
  • Startupコンストラクタ
  • ConfigureServicesメソッド、オプション
  • Configureメソッド
  • Startupコンストラクタ


    3.1で汎用ホスト(IHostBuilder)を使用する場合、Startupコンストラクション関数には、IWebHostEnvironment、IHostEnvironment、IConfigurationの3種類のサービスしか注入できません.他のサービスを注入しようとすると、InvalidOperationException異常が放出されます.
    System.InvalidOperationException: 'Unable to resolve service for type '***' while attempting to activate '_1_Startup.Startup'.'
    

    ホストの起動時には、Startupコンストラクション関数->ConfigureServicesメソッド->Configureメソッドの順に実行されます.Startupコンストラクション関数の実行時にホストはこの3つのサービスのみを提供し、他のサービスはConfigureServicesメソッドに追加する必要があります.そしてConfigureメソッドが実行されると、より多くのサービスタイプを使用することができます.

    ConfigureServicesメソッド


    ホストはコンフィギュレーション・サービス・メソッドを呼び出し、必要なサービスをコンフィギュレーション・メソッドとアプリケーション全体で利用できるように、注入に依存してサービス・コンテナに追加します.
    コンフィギュレーション・サービス・メソッドのパラメータには、IServiceCollection以外のサービスは入力できません.具体的には、IServiceCollectionの拡張方法でアプリケーションにさまざまな機能を構成できます.
    public void ConfigureServices(IServiceCollection services)
    {
    
        services.AddDbContext(options =>
            options.UseSqlServer(
                Configuration.GetConnectionString("DefaultConnection")));
        services.AddDefaultIdentity(
            options => options.SignIn.RequireConfirmedAccount = true)
            .AddEntityFrameworkStores();
    
        services.AddRazorPages();
    }
    

    Configureメソッド


    Configureメソッドは、アプリケーションがHTTPリクエストに応答する方法を指定するために使用されます.中間部品コンポーネントをIApplicationBuilderインスタンスに追加することで、要求パイプを構成できます.コンフィギュレーションメソッドパラメータのIApplicationBuilderは、サービスコンテナに登録する必要がなく、ホストによって作成され、コンフィギュレーションメソッドに直接渡されます.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拡張子は、要求パイプにミドルウェアを追加します.要求パイプに構成されたミドルウェアは、その後の次のミドルウェアを呼び出すか、パイプを直接短絡します.
    コンフィギュレーションメソッドパラメータでは,IWebHostEnvironment,ILoggerFactoryのようなサービス,あるいはコンフィギュレーションサービスメソッドでDIコンテナに追加されたサービスを自分のニーズに応じて注入することができる.

    コンフィギュレーションWebHostDefaultsで直接サービスとリクエストパイプを構成する


    ASP.NET Coreは、Startupクラスを使用せずにサービスと要求パイプを構成できる方法も提供しています.ConfigureWebHostDefaultsで提供されるConfigureServicesメソッドとConfigureメソッドをアップグレードすることもできます.
    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();
    
                        if (env.IsDevelopment())
                        {
                            app.UseDeveloperExceptionPage();
                        }
    
                        app.UseRouting();
    
                        app.UseEndpoints(endpoints =>
                        {
                            endpoints.MapGet("/", async context =>
                            {
                                await context.Response.WriteAsync("Hello World!");
                            });
                        });
                    });
                })