2

我有一个 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 中一样使用它。我是否误解了它?

4

0 回答 0