ASP.NET Coreにおける汎用ホスト(Generic Hosts)とは以下のようなアプリのリソースをカプセル化し便利に使えるようにするオブジェクトです。
特に、ASP.NET Coreでは事実上のエントリーポイントとなっています。
以下の例は汎用ホストを使い、Hello Worldを表示するWebアプリケーションを構築した例です。
var app = WebApplication.Create(args);
app.MapGet("/", () => "Hello World!");
app.Run();
WebApplicationでは条件に応じて次のミドルウェアが自動的に追加されます。
Createでは次のタスクが自動的に実行されます。
ASP.NET Coreでは依存関係の挿入(DI)が汎用ホストによってサポートされています。依存関係とは他のオブジェクトが依存するオブジェクトのことです。
ここでは、WriteMessageというメソッドを備えたMyDependencyというクラスについて調べてみます。
public class MyDependency
{
public void WriteMessage(string message)
{
Console.WriteLine($"MyDependency.WriteMessage called. Message: {message}");
}
}
MyDependencyクラスのインスタンスを作成してそのWriteMessageメソッドを使用することができます。
public class IndexModel : PageModel
{
private readonly MyDependency _dependency = new MyDependency();
public void OnGet()
{
_dependency.WriteMessage("IndexModel.OnGet");
}
}
このクラスはMyDependencyクラスを作成しこれに直接依存しています。
これは、次のような問題点があります。
依存関係の挿入は次の方法でこれらの問題に対処します。
既定のテンプレートでは次のログプロバイダーが追加されます。
ログを作成するには依存関係の挿入からILogger<TCategoryName>オブジェクトを使用します。
public class AboutModel : PageModel
{
private readonly ILogger _logger;
public AboutModel(ILogger<AboutModel> logger)
{
_logger = logger;
}
public void OnGet()
{
_logger.LogInformation("About page visited at {DT}",
DateTime.UtcNow.ToLongTimeString());
}
}
汎用ホストによって起動時に構成情報を読み取り実行されます。
以下のような様々な構成ソースを使用してキーと値ペアから構成データを読み取ります。これによって実行環境によって構成情報を変化させるということを実現できます。
また、構成情報を読み取る優先順位が設定されていますのでより優先順が高い構成情報でオーバーライドさせるといったことができます。
例えば、ローカル開発時にはappsettings.jsonなどの設定ファイルで構成情報を設定していたが本番環境ではAzure Key VaultやAzure App Configurationなどより優先順位の高い構成情報でオーバーライドすることができます。
以下のソースから構成データを読み取ります
汎用ホストを起動すると、サービスコンテナのホステッドサービスのコレクションに登録されているIhostedServiceの実装でIHostedService.StartAsyncが呼び出されます。
さらに、ホストが正常なシャットダウンを実行しているときにIHostedService.StopAsyncが呼び出されます。通常、このメソッドの中でタスクを終了するロジックやアンマネージドリソースを破棄するロジックを記述します。
これにより、アプリケーションのシャットダウンを安全に行うことができます。
ASP.NET Coreにおいてのユースケースとしてはバックグラウンドサービスを実装するケースです。
ASP.NET Coreには組み込みで多くのWebシステムで使われるであろうミドルウェアが用意されています。