.NET 6 Windows客户端(WinForms)中Ninject注入Serilog ILogger配置
.NET 6 WinForms中结合Serilog与Ninject实现ILogger注入
步骤1:安装必要NuGet包
需要安装以下包:
SerilogSerilog.Sinks.Console(可根据需求替换为Serilog.Sinks.File等其他输出目标)Serilog.Extensions.LoggingNinject
步骤2:初始化Serilog
在项目入口(如Program.cs)中先配置并启动Serilog:
using Serilog; // 配置Serilog Log.Logger = new LoggerConfiguration() .MinimumLevel.Debug() .WriteTo.Console() .CreateLogger();
步骤3:配置Ninject绑定
创建Ninject内核,配置泛型ILogger<T>的绑定逻辑,让Ninject能正确解析日志实例:
using Ninject; using Microsoft.Extensions.Logging; using Serilog.Extensions.Logging; var kernel = new StandardKernel(); // 注册Serilog的LoggerFactory实例 var loggerFactory = new SerilogLoggerFactory(Log.Logger); kernel.Bind<ILoggerFactory>().ToConstant(loggerFactory); // 绑定泛型ILogger<T>,通过LoggerFactory创建对应类型的日志实例 kernel.Bind(typeof(ILogger<>)).ToMethod(context => { var factory = context.Kernel.Get<ILoggerFactory>(); var targetType = context.GenericArguments[0]; return factory.CreateLogger(targetType); });
步骤4:修正TestingForm构造函数
确保构造函数为public,否则Ninject无法实例化该类:
public partial class TestingForm : Form { private readonly ILogger<TestingForm> _logger; public TestingForm(ILogger<TestingForm> logger) { InitializeComponent(); _logger = logger; // 测试日志输出 _logger.LogInformation("TestingForm初始化完成"); } }
步骤5:从Ninject容器获取Form实例
在Program.cs中,不要直接new TestingForm(),而是通过Ninject内核获取实例以完成依赖注入:
Application.SetHighDpiMode(HighDpiMode.SystemAware); Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); // 从容器获取TestingForm,自动注入ILogger实例 var form = kernel.Get<TestingForm>(); Application.Run(form);
补充说明
- 若需要通过配置文件(如
appsettings.json)管理Serilog规则,可安装Serilog.Settings.Configuration包扩展配置能力。 - 应用退出时记得调用
Log.CloseAndFlush()释放日志资源:
Application.ApplicationExit += (sender, e) => Log.CloseAndFlush();
内容的提问来源于stack exchange,提问作者spud
相关产品推荐
相关产品推荐

