.NET 8 コンソールアプリで、DI(Dependency Injection) する

2024/02/24
★★

Host.CreateDefaultBuilder と Host.CreateApplicationBuilder

以前の記事で、コンソール アプリで依存性の注入をするために、Generic Host を使う方法を説明しました。

ここで、以下のようなコードを説明しました。

// IHostBuilder ベース
public class Program
{
    public static void Main(string[] args)
	{
		IHost host = Host.CreateDefaultBuilder(args)
			.ConfigureServices(services =>
			{
				// DI
				services.AddTransient<IDemo001, Demo001>();
				services.AddScoped<IDemo002, Demo002>();
				services.AddSingleton<IDemo003, Demo003>();

				services.AddHostedService<Worker>();
			})
			.Build();

		host.Run();
	}
}

このコードでは、Microsoft.Extensions.Hosting.Host.CreateDefaultBuilder メソッドで、Microsoft.Extensions.Hosting.IHostBuilder のインスタンスを生成しています。このコードは、.NET 6 での説明でした。
.NET 7 以降では、この方法とは別に、Microsoft.Extensions.Hosting.Host.CreateApplicationBuilder メソッドで、Microsoft.Extensions.Hosting.IHostApplicationBuilder のインスタンスを生成する方法があります。

以下は、Host.CreateApplicationBuilder で IHostApplicationBuilder インスタンスを生成し、DI を行っているコードです。

// IHostApplicationBuilder ベース
public class Program
{
    public static void Main(string[] args)
    {
        var builder = Host.CreateApplicationBuilder(args);

        // DI
        builder.Services.AddTransient<IDemo001, Demo001>();
        builder.Services.AddScoped<IDemo002, Demo002>();
        builder.Services.AddSingleton<IDemo003, Demo003>();

        builder.Services.AddHostedService<Worker>();

        var host = builder.Build();
        host.Run();
    }
}

CreateDefaultBuilder で生成した IHostBuilder と CreateApplicationBuilder で生成した IHostApplicationBuilder とでは、構成の記述方法は異なりますが、同様のことを行うことができます。 各構成を行うのに、IHostBuilder では、コールバックを使い、IHostApplicationBuilder では、コールバックを使用していません。 コールバックを使用しない IHostApplicationBuilder の方が、コードが分かりやすいと思います。

IHostBuilder と IHostApplicationBuilder

現時点 (.NET 8) では、IHostBuilder と IHostApplicationBuilder の両方が使用できる状態にあります。今後は、コールバックを使用しない IHostApplicationBuilder へ移行される計画があるようなので、IHostApplicationBuilder を利用した方が良いでしょう。

背景としては、ASP.NET Core では、.NET 6 以降で、Web アプリケーション ホストに、Microsoft.AspNetCore.Builder.WebApplication.CreateBuilder メソッドで、Microsoft.AspNetCore.Builder.WebApplicationBuilder インスタンスを生成し、コールバックを使用しない方法へ移行しました。Generic Host も同様に、コールバックを使用しない方法へ移行する計画となっているようですが、既存の拡張機能が動作しない問題があるため、IHostBuilder が残っているようです。

このあたりの説明が、以下にあります。

Worker プロジェクト テンプレート

現在の dotnet new worker コマンドや Visual Studio 2022 の ワーカー サービス 選択時のプロジェクトテンプレート作成時では、IHostApplicationBuilder によるコードが生成されます。

以上、参考までに。

コメント (0)

コメントの投稿