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 で依存関係の挿入を使用する
0 件のコメント:
コメントを投稿