Prism 8+Unity的.Net 5 WPF项目如何注入Microsoft.Extensions.Logging.ILogger
基于Prism 8 + Unity + .NET 5 WPF 注入Microsoft.Extensions.Logging.ILogger实现方案
前置依赖安装
先确认你已经安装以下Nuget包,缺失的可以自行安装:
Microsoft.Extensions.LoggingMicrosoft.Extensions.Logging.AbstractionsSerilog.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
相关产品推荐
相关产品推荐

