如何在Prism Unity中注册NLog以提供Microsoft.Extensions.Logging.ILogger<T>
解决方案:在Prism Unity中注册NLog以提供
Microsoft.Extensions.Logging.ILogger 核心思路
要让Prism Unity容器在解析ILogger<T>或ILogger时返回NLog的实现,核心是把NLog适配为Microsoft.Extensions.Logging规范的日志提供程序,再整合到Prism的Unity容器体系中。
步骤分解
1. 安装必要NuGet包
确保WPF项目安装以下包:
NLog.Extensions.Logging:实现NLog到Microsoft.Extensions.Logging的适配Prism.Unity:Prism的Unity容器实现Microsoft.Extensions.Logging:基础日志抽象接口
2. 配置NLog
在WPF项目根目录添加nlog.config配置文件,按需设置日志输出目标、级别规则等,记得将文件属性设为复制到输出目录:如果较新则复制。
3. 在Prism启动流程中注册日志服务
在App.xaml.cs的RegisterTypes方法里完成容器注册:
protected override void RegisterTypes(IContainerRegistry containerRegistry) { // 1. 创建LoggerFactory并添加NLog提供程序 var loggerFactory = LoggerFactory.Create(builder => { builder.AddNLog(); // 注册NLog作为日志实现 }); // 2. 把LoggerFactory实例注册到Unity容器 containerRegistry.RegisterInstance<ILoggerFactory>(loggerFactory); // 3. 注册泛型ILogger<T>的实现,让容器自动解析具体类型的日志实例 containerRegistry.Register(typeof(ILogger<>), typeof(Logger<>)); }
4. 在共享代码中直接使用
现在构造函数注入ILogger<T>时,Unity会自动提供NLog实现的实例:
public class SharedBusinessService(ILogger<SharedBusinessService> logger) { public void ExecuteOperation() { logger.LogInformation("通过NLog记录共享代码的日志"); } }
补充说明
Logger<>是Microsoft.Extensions.Logging提供的默认泛型包装类,它会从注册的ILoggerFactory获取NLog的具体实现- 如果需要注入非泛型的
ILogger,可以额外注册默认实例:
containerRegistry.RegisterInstance<ILogger>(loggerFactory.CreateLogger("DefaultLogger"));
内容的提问来源于stack exchange,提问作者Franz
相关产品推荐
相关产品推荐

