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

Prism 8+Unity的.Net 5 WPF项目如何注入Microsoft.Extensions.Logging.ILogger

基于Prism 8 + Unity + .NET 5 WPF 注入Microsoft.Extensions.Logging.ILogger实现方案

前置依赖安装

先确认你已经安装以下Nuget包,缺失的可以自行安装:

  • Microsoft.Extensions.Logging
  • Microsoft.Extensions.Logging.Abstractions
  • Serilog.Extensions.Logging
  • Prism.Unity 8.x 版本包、Serilog核心包

步骤1:提前配置Serilog实例

在App.xaml.cs的构造方法中先完成Serilog的全局配置:

public partial class App
{
    public App()
    {
        // 配置Serilog日志规则
        Log.Logger = new LoggerConfiguration()
            .MinimumLevel.Information()
            .MinimumLevel.Override("Microsoft", Serilog.Events.LogEventLevel.Warning)
            .WriteTo.Console()
            .WriteTo.File("logs/applog-.log", rollingInterval: RollingInterval.Day, retainedFileCountLimit: 30)
            .CreateLogger();
    }
}

步骤2:在Prism容器中注册日志组件

重写Prism应用的RegisterTypes方法,完成ILoggerFactory和泛型ILogger的注册:

protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
    // 构建LoggerFactory,绑定Serilog提供器,后续新增其他日志提供器只需修改此配置块
    var loggerFactory = LoggerFactory.Create(logBuilder =>
    {
        logBuilder.AddSerilog(dispose: true);
        // 示例:如果要新增调试输出提供器,直接加 logBuilder.AddDebug(); 即可
    });

    // 注册LoggerFactory单例到容器
    containerRegistry.RegisterInstance<ILoggerFactory>(loggerFactory);

    // 注册开放泛型的ILogger<T>,支持任意类型的泛型Logger注入
    containerRegistry.Register(typeof(ILogger<>), typeof(Logger<>));

    // 可选:如果需要注入非泛型的ILogger,注册根Logger实例
    containerRegistry.RegisterInstance<ILogger>(loggerFactory.CreateLogger("Global"));

    // 你的其他服务、ViewModel注册逻辑
    containerRegistry.RegisterForNavigation<MainWindow, MainWindowViewModel>();
}

步骤3:ViewModel中注入使用

直接在ViewModel的构造函数中声明对应泛型的ILogger参数即可,Unity容器会自动完成实例注入:

public class MainWindowViewModel : BindableBase
{
    private readonly ILogger<MainWindowViewModel> _logger;

    public MainWindowViewModel(ILogger<MainWindowViewModel> logger)
    {
        _logger = logger;

        // 测试日志输出
        _logger.LogInformation("MainWindowViewModel初始化完成");
    }
}

常见问题规避

  • 不要手动实现ILogger的泛型解析逻辑,Prism 8配套的Unity容器原生支持开放泛型注册,直接注册typeof(ILogger<>)即可自动匹配所有泛型参数的注入请求
  • 日志提供器的切换完全不需要修改业务层的注入逻辑,仅需调整LoggerFactory.Create中的提供器注册代码即可,满足灵活切换日志提供器的需求
  • 程序退出时记得调用Log.CloseAndFlush()确保所有日志都被持久化,可放在OnExit重写方法中

内容的提问来源于stack exchange,提问作者EuroEager

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 10:06:02