Application Startup in ASP.NET Core - 日本語意訳

- 2017/03/15(Wed) 時点の情報に基づいています
- 公式ドキュメント：[Application Startup in ASP.NET Core](https://docs.microsoft.com/ja-jp/aspnet/core/fundamentals/startup)

# ASP.NET Core でのアプリケーションの起動

`Startup` クラスは、アプリケーションに対して行われたすべてのリクエストを処理するリクエストパイプラインを構成します。


## Startup クラス

ASP.NET Core アプリケーションには `Startup` クラスが必要です。慣例として、`Startup` クラスの名前は "Startup" です。`Main` メソッド内で、[WebHostBuilderExtensions](https://docs.microsoft.com/aspnet/core/api/microsoft.aspnetcore.hosting.webhostbuilderextensions) クラスの
 [`UseStartup<TStartup>`](https://docs.microsoft.com/aspnet/core/api/microsoft.aspnetcore.hosting.webhostbuilderextensions#Microsoft_AspNetCore_Hosting_WebHostBuilderExtensions_UseStartup__1_Microsoft_AspNetCore_Hosting_IWebHostBuilder_) メソッドに `Startup` クラス名を指定します。

異なる環境に応じて別々の `Startup` クラスを定義することができ、実行時に適切なクラスが選択されます。

WebHost の構成またはオプションの中で `startupAssembly` を指定すると、ホストはその起動アセンブリを読み込み、`Startup` または `Startup[Environment]` タイプを検索します。

`StartupLoader` クラスの [FindStartupType](https://github.com/aspnet/Hosting/blob/rel/1.1.0/src/Microsoft.AspNetCore.Hosting/Internal/StartupLoader.cs) メソッドと [Working with multiple environments](environments.md#startup-conventions) を参照してください。 `UseStartup<TStartup>` メソッドは推奨されるアプローチです。

`Startup` クラスのコンストラクタに、[dependency injection](dependency-injection.md) によってオブジェクトを注入することができます。例えば、`IHostingEnvironment` を注入して構成ソースを設定したり、`ILoggerFactory` を注入して[logging](logging.md) プロバイダーを設定することができます。

`Startup` クラスには `Configure` メソッドが必須で、オプションで `ConfigureServices` メソッドを含めることができます。どちらもアプリケーションの起動時に呼び出されます。`Startup` クラスはまた、これらのメソッドの環境固有バージョンを含めることもできます。

[handling exceptions during application startup](error-handling.md#startup-exception-handling) について学びましょう.


## Configure メソッド

`Configure` メソッドは、ASP.NET Core アプリケーションが HTTP リクエストにどのように応答するかを指定するために使用されます。リクエストパイプラインは、[middleware](middleware.md) コンポーネントを `IApplicationBuilder` インスタンスに追加することによって構成されます。`IApplicationBuilder` インスタンスは Dependency Injection によって注入されます。

以下のデフォルト Web サイトテンプレートのサンプルでは、いくつかの拡張メソッドを使用して、BrowserLink、error pages、 static files、 ASP.NET MVC、 および Identity をサポートするパイプラインを構成しています。

```csharp:C#
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    loggerFactory.AddConsole(Configuration.GetSection("Logging"));
    loggerFactory.AddDebug();

    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
        app.UseDatabaseErrorPage();
        app.UseBrowserLink();
    }
    else
    {
        app.UseExceptionHandler("/Home/Error");
    }

    app.UseStaticFiles();

    app.UseIdentity();

    app.UseMvc(routes =>
    {
        routes.MapRoute(
            name: "default",
            template: "{controller=Home}/{action=Index}/{id?}");
    });
}
```
各 `Use` 拡張メソッドは、リクエストパイプラインに [Middleware](middleware.md) コンポーネントを追加します。例えば、`UseMvc` 拡張メソッドは [Routing](routing.md) Middleware をリクエストパイプラインに追加し、[MVC](../mvc/index.md) をデフォルトハンドラーとして構成します。

`IApplicationBuilder` の使い方の詳細については、[Middleware](middleware.md)を参照してください。

`IHostingEnvironment` や `ILoggerFactory` のような追加の Service もメソッドの引数に指定することができます。これらの Service が利用可能であれば[注入](dependency-injection.md) されます。


## ConfigureServices メソッド

[ConfigureServices](https://docs.microsoft.com/en-us/aspnet/core/api/microsoft.aspnetcore.hosting.startupbase#Microsoft_AspNetCore_Hosting_StartupBase_ConfigureServices_Microsoft_Extensions_DependencyInjection_IServiceCollection_) メソッドはオプションですが、もし使用された場合は、実行時に `Configure` メソッドの前に呼び出されます(一部の機能はリクエストパイプラインに組み込まれる前に追加されます)。 [構成オプション](configuration.md) はこのメソッドで設定されます。

実質的なセットアップが必要な機能のために、[IServiceCollection](https://docs.microsoft.com/en-us/aspnet/core/api/microsoft.extensions.dependencyinjection.iservicecollection) には `Add[Service]` 拡張メソッドが用意されています。このデフォルト Web サイトテンプレートのサンプルでは、Entity Framework、Identity、および MVC の Service を使用するようにアプリケーションを構成しています。

```csharp:C#
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>();
}
```

`IServiceCollection` に 追加された Service は、
[Dependency Injection](dependency-injection.md) を介してアプリケーション内で利用できるようになります。


## Startup クラスで利用可能な Service 

ASP.NET Core の Dependency Injection はアプリケーションの起動時にアプリケーションサービスを提供します。これらのサービスを使用するには、`Startup` クラスのコンストラクタまたは `Configure` メソッドまたは `ConfigureServices` メソッドの引数として適切なインターフェースを指定します。 

`Startup` クラスの各メソッドを呼び出し順に見てみましょう、それぞれ以下のサービスが引数で指定できます。

* コンストラクタ
 - `IHostingEnvironment`
 - `ILoggerFactory`  
* `ConfigureServices` メソッド
 - `IServiceCollection`  
* `Configure` メソッド
 - `IApplicationBuilder`
 - `IHostingEnvironment`
 - `ILoggerFactory`
 - `IApplicationLifetime`


## その他のリソース

* [Working with Multiple Environments](environments.md)
* [Middleware](middleware.md)
* [Logging](logging.md)
* [Configuration](configuration.md)