[C#][ログ出力] 第3回:現場のスタンダード!DI(依存性注入)でロガーを受け取る

スポンサーリンク

はじめに

モダンな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, "処理中にエラーが発生しました。");
        }
    }
}

コード解説

  1. Host.CreateDefaultBuilder: DIコンテナ(家電の管理センター)を立ち上げます。標準でコンソールログなどの「家電(実体)」が登録された状態になります。

  2. コンストラクタでの受け取り: MyProcessingService は、自分が使うロガーが「どこに出力されるものか」を知りません。単に「ILogger というルール(コンセント)に従った道具をください」と頼んでいるだけです。

  3. 疎結合のメリット: この設計にしておけば、クラスの中身を一切書き換えずに、設定一つでログの出力先をコンソールからクラウド(Azure Monitor等)へ切り替えることができるようになります。

まとめ

「必要な道具は自分で作らず、外から持ってきてもらう」。これがDIの本質です。クラスが特定のロガーに依存しなくなることで、コードの再利用性やテストのしやすさが劇的に向上します。

 

Please follow and like us:

コメント

タイトルとURLをコピーしました