C#(.NET Core)のコンソールアプリでDIする

2023年8月23日水曜日

C#

t f B! P L

最近のASP .NET Coreでは、依存関係はDIで注入するのが一般的だ。
Webアプリを作る場合、一緒にコンソールアプリ(バッチ処理)を作ることがよくあり、その場合、ASP .NET Coreと同じくコンソールアプリでもDIしたいと思うのが自然な発送であろう。

今回は、C#(.NET Core)のコンソールアプリでDIを実現する方法を解説する。

「Microsoft.Extensions.Hosting」をインストール

まず最初にNuGetから「Microsoft.Extensions.Hosting」をインストールする。
このパッケージは、環境ごとの設定ファイル(application.<EnvironmentName>.json)を読み込んだり、DIで依存関係を注入する仕掛けを利用する一連の機能を提供するものである。

「Microsoft.Extensions.Hosting」は以下のコマンドからか、NuGetの管理画面からインストールする。

dotnet add package Microsoft.Extensions.Hosting

コンソールアプリの実装

アプリのエントリポイントとなる Program.cs を修正

エントリポイントの修正をする。
それぞれの処理内容なコメントを参照。

using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Configuration;

HostApplicationBuilder builder = Host.CreateApplicationBuilder (args);

// デフォルトの「appsettings.json」と環境ごとの設定を読み込むための設定
IHostEnvironment env = builder.Environment;
builder.Configuration
    .AddJsonFile ("appsettings.json", optional: true, reloadOnChange: true)
    .AddJsonFile ($"appsettings.{env.EnvironmentName}.json", true, true);

// 依存関係の登録(ここでDIで対象となるクラスを登録する)
builder.Services.AddSingleton<CommonService> ();
builder.Services.AddTransient<SampleJob> ();

// バッチジョブの起動
using IHost host = builder.Build ();
ExecuteJob (host.Services, args);

static void ExecuteJob (IServiceProvider hostProvider, string[] args) {
  // スコープの作成
  using IServiceScope serviceScope = hostProvider.CreateScope ();
  IServiceProvider provider = serviceScope.ServiceProvider;
  // SampleJobクラスを取得して処理を実行
  var job = provider.GetRequiredService<SampleJob>();
  job.Execute (args);
}

これで、コンソールアプリでDIする準備が整った。
あとは依存関係で必要なクラスを実装するだけである。

必要なクラスの実装

DIを利用するクラスの実装は、ASP .NET Coreなどと一緒。
例えば、SampleJob クラスから CommonService の依存関係を実装るう場合は次のようなコードを書く。

public class SampleJob {

  private CommonService _commonService;

  public SampleJob(
    CommonService commonService
  ) {
    _commonService = commonService;
  }

  protected override int Execute(string[] args) {
    return 0;
  }
}

環境別の設定

開発・本番環境など、環境ごとのapplication.json を作り、環境変数の設定で切り替えられる様にする。

application.jsonの作成

application.json (デフォルトの設定)

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*"
}

application.Development.json(開発環境の設定)

{
  "Logging": {
    "LogLevel": {
      "Default": "Trace",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "ConnectionStrings": {
    "DBConnectString": "開発環境の接続文字列"
  }
}

application.Production.json (本番環境の設定)

{
  "ConnectionStrings": {
    "DBConnectString": "本番環境の接続文字列"
  }
}

環境変数の設定

環境変数 DOTNET_ENVIRONMENT にアプリの実行環境を設定する。
例えば、この環境変数にDevelopmentを設定すると、application.jsonapplication.Development.jsonの2つの設定ファイルが読み込まれる。

まとめ

.NET CoreのコンソールアプリでDIを実現する方法を紹介しました。
Javaなどの言語では古くからDIを用いた実装が一般化してましたが、今後はC#などの .NET言語でもDIを用いた実装が普通になっていくでしょう。

スポンサーリンク
スポンサーリンク

このブログを検索

Profile

自分の写真
Webアプリエンジニア。 日々新しい技術を追い求めてブログでアウトプットしています。
プロフィール画像は、猫村ゆゆこ様に書いてもらいました。

仕事募集もしていたり、していなかったり。

QooQ