(VB.NET)DIコンテナとInterfaceの使用例 - tsukimisoba/Blog GitHub Wiki

2025/05/28記載
VB.NET における Interface の例

  • VB.NETで記述
  • NET9.0を使用
  • スタートアップオブジェクトは Sub Main()
  • ConfigurationBuilder() は Microsoft.Extensions.Configuration を使用
  • DIコンテナは Microsoft.Extensions.DependencyInjectionを使用
  • DIコンテナの設定は Sub Main() に記述
  • DIコンテナ内で ConsoleLogger と FileLogger を appsettings.json のデータで切り替えられる
  • Logger は Nlog を使用
  • NLog.config を appsettings.json に統合

1. appsettings.json の設定

まず、appsettings.json にログの種類と NLog の設定を統合します。

{
  "Logging": {
    "Type": "ConsoleLogger",
    "NLog": {
      "internalLogFile": "logs/internal.log",
      "targets": {
        "logfile": {
          "type": "File",
          "fileName": "logs/app.log",
          "layout": "${longdate}|${level}|${message}"
        },
        "logconsole": {
          "type": "Console",
          "layout": "${longdate}|${level}|${message}"
        }
      },
      "rules": [
        {
          "logger": "ConsoleLogger",
          "minlevel": "Info",
          "writeTo": "logconsole"
        },
        {
          "logger": "FileLogger",
          "minlevel": "Info",
          "writeTo": "logfile"
        }
      ]
    }
  }
}

この "Logging:Type" の値を変更することで、ConsoleLoggerFileLogger を切り替えられるようにします。


2. ILogger インターフェースの定義

共通のログ出力メソッドを持つ ILogger インターフェースを定義します。

Public Interface ILogger
    Sub Log(ByVal message As String)
End Interface

3. ConsoleLoggerFileLogger の実装

異なるログの種類を ILogger を実装して作成します。

① ConsoleLogger

Imports NLog

Public Class ConsoleLogger
    Implements ILogger

    Private ReadOnly _logger As Logger = LogManager.GetLogger("ConsoleLogger")

    Public Sub Log(ByVal message As String) Implements ILogger.Log
        _logger.Info($"[Console] {message}")
    End Sub
End Class

② FileLogger

Imports NLog

Public Class FileLogger
    Implements ILogger

    Private ReadOnly _logger As Logger = LogManager.GetLogger("FileLogger")

    Public Sub Log(ByVal message As String) Implements ILogger.Log
        _logger.Info($"[File] {message}")
    End Sub
End Class

4. DI コンテナのセットアップ

Microsoft.Extensions.DependencyInjection を使用して、appsettings.json の設定に基づいて ILogger の実装を切り替えます。

Imports Microsoft.Extensions.DependencyInjection
Imports Microsoft.Extensions.Configuration
Imports NLog
Imports NLog.Config
Imports NLog.Targets

Module Program
    Sub Main()
        ' 設定ファイルの読み込み
        Dim config As IConfiguration = New ConfigurationBuilder() _
            .SetBasePath(AppDomain.CurrentDomain.BaseDirectory) _
            .AddJsonFile("appsettings.json", optional:=False, reloadOnChange:=True) _
            .Build()

        ' NLog の設定を appsettings.json から適用
        Dim nlogConfig As New LoggingConfiguration()
        Dim nlogSettings = config.GetSection("Logging:NLog")

        ' ファイルログの設定
        Dim fileTarget As New FileTarget("logfile") With {
            .FileName = nlogSettings.GetSection("targets:logfile:fileName").Value,
            .Layout = nlogSettings.GetSection("targets:logfile:layout").Value
        }
        nlogConfig.AddTarget(fileTarget)

        ' コンソールログの設定
        Dim consoleTarget As New ConsoleTarget("logconsole") With {
            .Layout = nlogSettings.GetSection("targets:logconsole:layout").Value
        }
        nlogConfig.AddTarget(consoleTarget)

        ' ログルールの設定
        Dim rules = nlogSettings.GetSection("rules").GetChildren()
        For Each rule In rules
            Dim loggerName = rule.GetSection("logger").Value
            Dim minLevel = LogLevel.FromString(rule.GetSection("minlevel").Value)
            Dim writeTo = rule.GetSection("writeTo").Value
            nlogConfig.AddRule(minLevel, LogLevel.Fatal, writeTo, loggerName)
        Next

        LogManager.Configuration = nlogConfig

        ' DI コンテナのセットアップ
        Dim services As New ServiceCollection()

        ' appsettings.json の設定に基づいて ILogger の実装を選択
        Dim loggerType As String = config.GetSection("Logging:Type").Value

        If loggerType = "ConsoleLogger" Then
            services.AddSingleton(Of ILogger, ConsoleLogger)()
        ElseIf loggerType = "FileLogger" Then
            services.AddSingleton(Of ILogger, FileLogger)()
        Else
            Throw New Exception("無効なロガータイプが設定されています")
        End If

        ' DI コンテナの構築
        Dim serviceProvider As IServiceProvider = services.BuildServiceProvider()

        ' ロガーの取得と使用
        Dim logger As ILogger = serviceProvider.GetService(Of ILogger)()
        logger.Log("アプリケーション開始")
    End Sub
End Module

5. 仕組みの説明

  1. appsettings.json"Logging:Type" の値を取得
  2. ConsoleLogger または FileLogger を DI コンテナに登録
  3. ILogger のインスタンスを取得し、ログ出力を実行
  4. NLog の設定を appsettings.json から読み込み、ログの出力先を設定

この方法により、設定ファイルを変更するだけでログの種類を切り替え られます。


6. まとめ

この設計により:

  • .NET 9.0Microsoft.Extensions.DependencyInjection を活用
  • appsettings.json"Logging:Type" を変更するだけで ConsoleLoggerFileLogger を切り替え可能
  • NLog を使用してログ管理を実現
  • appsettings.jsonNLog.config の設定を統合し、柔軟なログ管理を実現