(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 に統合
appsettings.json
の設定
1. まず、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"
の値を変更することで、ConsoleLogger
と FileLogger
を切り替えられるようにします。
ILogger
インターフェースの定義
2. 共通のログ出力メソッドを持つ ILogger
インターフェースを定義します。
Public Interface ILogger
Sub Log(ByVal message As String)
End Interface
ConsoleLogger
と FileLogger
の実装
3. 異なるログの種類を 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. 仕組みの説明
appsettings.json
の"Logging:Type"
の値を取得ConsoleLogger
またはFileLogger
を DI コンテナに登録ILogger
のインスタンスを取得し、ログ出力を実行NLog
の設定をappsettings.json
から読み込み、ログの出力先を設定
この方法により、設定ファイルを変更するだけでログの種類を切り替え られます。
6. まとめ
この設計により:
.NET 9.0
でMicrosoft.Extensions.DependencyInjection
を活用appsettings.json
の"Logging:Type"
を変更するだけでConsoleLogger
とFileLogger
を切り替え可能NLog
を使用してログ管理を実現appsettings.json
にNLog.config
の設定を統合し、柔軟なログ管理を実現