はじめに
モダンなC#開発において避けては通れないのが「DI(Dependency Injection:依存性注入)」です。言葉だけ聞くと難解ですが、身近なもので例えるなら**「コンセントと家電」**の関係にそっくりです。
壁に直接ドライヤーが埋め込まれていたら不便ですよね?コンセント(インターフェース)があるからこそ、私たちは好きな家電を自由に差し替えて使うことができます。今回は、この「コンセント」の仕組みを使ってログ出力を行う方法を学びましょう。
この記事で学べること
-
DI(依存性注入)を「コンセント」で理解する
-
コンストラクタを使って、外部からロガーを受け取る方法
-
なぜ「自分で new しない」ことが大切なのか
サンプルコード
.NETの「汎用ホスト」を利用して、DIコンテナからロガーを注入してもらう標準的な構成です。
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
// 1. ホストの構築(ここで「コンセントの差し込み口」を準備するイメージ)
using IHost host = Host.CreateDefaultBuilder(args).Build();
// 2. DIコンテナから、ロガーが組み込まれたサービスを取得
var myService = host.Services.GetRequiredService();
myService.DoWork();
// --- ログを出力するクラス ---
public class MyProcessingService
{
private readonly ILogger _logger;
// 3. コンストラクタ注入
// 「私は ILogger というコンセントを使います」と宣言するだけ
public MyProcessingService(ILogger logger)
{
_logger = logger; // 実際の実体(コンソールかファイルか等)は外から渡される
}
public void DoWork()
{
_logger.LogInformation("DIによって注入されたロガーで出力しています。");
try
{
_logger.LogDebug("詳細な処理を開始します...");
// 実際の処理
}
catch (Exception ex)
{
_logger.LogError(ex, "処理中にエラーが発生しました。");
}
}
}
コード解説
-
Host.CreateDefaultBuilder: DIコンテナ(家電の管理センター)を立ち上げます。標準でコンソールログなどの「家電(実体)」が登録された状態になります。
-
コンストラクタでの受け取り:
MyProcessingServiceは、自分が使うロガーが「どこに出力されるものか」を知りません。単に「ILoggerというルール(コンセント)に従った道具をください」と頼んでいるだけです。 -
疎結合のメリット: この設計にしておけば、クラスの中身を一切書き換えずに、設定一つでログの出力先をコンソールからクラウド(Azure Monitor等)へ切り替えることができるようになります。
まとめ
「必要な道具は自分で作らず、外から持ってきてもらう」。これがDIの本質です。クラスが特定のロガーに依存しなくなることで、コードの再利用性やテストのしやすさが劇的に向上します。
Please follow and like us:
コメント