C# (.NET Core) コンソールアプリで依存性注入(DI)を実装

2024年3月26日火曜日

C#

t f B! P L

ASP.NET Coreの世界では、依存性注入(DI)を用いてコンポーネント間の依存関係を管理するのが主流になっています。この手法は、Webアプリケーション開発だけでなく、バッチ処理などのコンソールアプリケーションでも同様に有効です。今回は、C# (.NET Core) を使用したコンソールアプリケーションでDIを実現する方法について解説します。

Microsoft.Extensions.Hostingの導入

DIを実現する第一歩として、「Microsoft.Extensions.Hosting」パッケージを導入します。このパッケージは、アプリケーションの起動時の設定読み込みや依存性注入の設定など、基本的なアプリケーションインフラストラクチャを提供します。

NuGetからのインストールは次のコマンドで行えます。

dotnet add package Microsoft.Extensions.Hosting

コンソールアプリケーションの構成

Program.csの修正

アプリケーションのエントリーポイントである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);
}

依存クラスの実装

依存性注入を利用するクラスの実装例を以下に示します。この例では、SampleJobクラスがCommonServiceに依存していることを表しています。

public class SampleJob {

  private CommonService _commonService;

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

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

環境ごとの設定管理

アプリケーションの設定は環境ごと(開発、本番など)に管理することが重要です。以下は設定ファイルの例です。

application.jsonの作成

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

開発環境用設定 (appsettings.Development.json)

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

本番環境用設定 (appsettings.Production.json)

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

環境変数の設定

アプリケーションの実行環境に応じて設定を動的に切り替えるために、環境変数DOTNET_ENVIRONMENTを使用します。この環境変数の値に応じて、対応する設定ファイルが適用されます。

まとめ

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

参考リンク:
チュートリアル: .NET で依存関係の挿入を使用する

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

このブログを検索

Profile

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

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

QooQ