You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 01:01:00