.NET 6のコンソールアプリケーションでDIを使う方法

この記事は公開から2年以上経過しています。

Webサービスではお馴染みのDependency Injectionを.NET 6のコンソールアプリケーション(バックグラウンドタスク)で利用するサンプル。


サンプルソースコード(C#)

ConsoleAppDISample.csproj

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net6.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.Extensions.Hosting" Version="6.0.1" />
  </ItemGroup>

</Project>

※NuGetのMicrosoft.Extensions.Hostingパッケージを追加。

Program.cs

using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;

// 汎用ホストの生成
Host.CreateDefaultBuilder(args)
.ConfigureServices((_, services) =>
    services
    .AddHostedService<MainService>()            // バックグラウンドタスク(ホステッド)サービスを追加
    .AddSingleton<ISubService, SubService>()    // シングルトンの依存サービスをを追加
)
.Build()
.Run();

// バックグラウンドタスク(ホステッド)サービスクラス
internal sealed class MainService : IHostedService, IDisposable
{
    // コンストラクタインジェクション
    public MainService(ISubService di)
    {
        di.Do();
    }

    public void Dispose() { }

    public Task StartAsync(CancellationToken cancellationToken)
    {
        // ダミー
        return Task.CompletedTask;
    }

    public Task StopAsync(CancellationToken cancellationToken)
    {
        // ダミー
        return Task.CompletedTask;
    }
}

// DIサービスI/F
internal interface ISubService
{
    void Do();
}

// DIサービスクラス
internal sealed class SubService : ISubService, IDisposable
{
    private readonly ILogger<SubService> _logger;

    // コンストラクタインジェクション
    public SubService(ILogger<SubService> logger)
    {
        _logger = logger;
    }

    public void Dispose() { }

    public void Do()
    {
        _logger.LogInformation("DIサービスが実行されました");
    }
}


参考ウェブサイトなど

以上です。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする