我有一个 PRISM (8.1.97) WPF 应用程序在 .net5.0 上运行,带有统一容器。
我想做的是将 Serilog 指定为我的日志记录提供程序,但Microsoft.Extensions.Logging
通过我的 DI 注册服务的构造函数注入常用的记录器(例如,仅ILogger<MyService> logger
在构造函数中使用)。
其中,第二个是最直接的。基本上,您添加Prism.Container.Extensions,然后在 App.xaml.cs 中覆盖 CreateContainerExtension()。这为您提供了一种访问服务集合的方法,看起来就像您使用内置的 .net 5 DI 获得的一样。
在 App.xaml.cs 我的 App 类下面...
public partial class App : PrismApplication
{
private IConfigurationRoot configRoot;
protected override Window CreateShell()
{
// Configures logger using json config file
Log.Logger = new LoggerConfiguration()
.ReadFrom.Configuration(configRoot)
.CreateLogger();
return Container.Resolve<MainWindow>();
}
protected override IContainerExtension CreateContainerExtension()
{
configRoot = new ConfigurationBuilder()
.AddJsonFile($"appsettings.{Environment.GetEnvironmentVariable("DOTNET_ENVIRONMENT")}.json", optional: false)
.Build();
IContainerExtension containerExtension = base.CreateContainerExtension();
containerExtension.RegisterServices(
services =>
{
// Makes serilog the logging provider?
services.AddLogging(loggingBuilder => loggingBuilder.AddSerilog(dispose: true));
});
return containerExtension;
}
protected override void ConfigureModuleCatalog(IModuleCatalog moduleCatalog)
{
// just a simple module with Views/viewModels
var moduleAType = typeof(DevTestingModule);
moduleCatalog.AddModule(new ModuleInfo()
{
ModuleName = moduleAType.Name,
ModuleType = moduleAType.AssemblyQualifiedName,
InitializationMode = InitializationMode.WhenAvailable
});
}
protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
// intentionally empty
}
}
以上似乎是合理的,但问题是当我尝试注入一个记录器时,例如在 MainWindow(Prism Shell)中,它Container.Resolve<MainWindow>();
在 App.xaml.cs 的 CreateShell() 中给出了一个异常。
这是我的 MainWindow.xaml.cs 类,当我尝试注入记录器时......
public partial class MainWindow : Window
{
private readonly ILogger<MainWindow> log;
public MainWindow(ILogger<MainWindow> log)
{
InitializeComponent();
this.log = log;
log.LogInformation("hello?");
}
}
异常是一个Prism.Ioc.ContainerResolutionException
并且最显着的内部异常是......
没有可用于类型 System.IServiceProvider 的公共构造函数。
我想我搞砸了一些事情,但我不确定我是否在正确的轨道上。似乎CreateContainerExtension()
从 Prism.Container.Extensions 覆盖的意图是给我一个 IServiceCollection,可以像在 Microsoft 的 .net 5 的 DI 中一样使用它。我是否误解了它?