如何为 .NET Core 3.0 中 WPF 配置依赖注入 ?

Posted dotNET跨平台

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何为 .NET Core 3.0 中 WPF 配置依赖注入 ?相关的知识,希望对你有一定的参考价值。

咨询区

  • user842818

我非常熟悉 ASP.NET Core 和它开箱即用的依赖注入支持,当 Controller 需要依赖注入时,可以在 构造函数 中以参数的形式来实现,这个IOC的理念相当好,我想把它带到 WPF 中,当我同样以构造函数的方式进行注入却无法实现。

请问我该如何修改让 WPF 支持呢,我真的很喜欢IOC。

回答区

  • maytham-ɯɐɥʇʎɐɯ

我最近在一个项目也需要实现这个功能,我是这样实现的。

首先需要创建一个 WPF Core 3 的项目,然后从 nuget 上安装依赖包: Microsoft.Extensions.DependencyInjection

在我的项目中,我创建了一个 LogBase 类用来记录日志,这里我就拿它来做例子。


private readonly ServiceProvider _serviceProvider;

public App()
{
    var serviceCollection = new ServiceCollection();
    ConfigureServices(serviceCollection);
    _serviceProvider = serviceCollection.BuildServiceProvider();
}
    
private void ConfigureServices(IServiceCollection services)
{
    services.AddSingleton<ILogBase>(new LogBase(new FileInfo($@"C:\\temp\\log.txt")));
    services.AddSingleton<MainWindow>();
}
    
private void OnStartup(object sender, StartupEventArgs e)
{
    var mainWindow = _serviceProvider.GetService<MainWindow>();
    mainWindow.Show();
}

然后在 App.xaml 中添加 Startup="OnStartup" ,比如下面这样:


<Application x:Class="VaultDataStore.Wpf.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:VaultDataStore.Wpf"
             Startup="OnStartup">
    <Application.Resources>
        
    </Application.Resources>
</Application>

接下来我就可以将 ILogBase 注入到构造函数中,如下代码所示:


private readonly ILogBase _log;

public MainWindow(ILogBase log)
{
    _log = log;

    ...etc.. you can use _log over all in this class
}

完整的代码,我上传到了 github:https://github.com/maythamfahmi/WpfSampleDi

点评区

自打.NET Core 面市以来,IOC 逐渐盛行,现在已经很难在代码中看到 new 了,取而代之的是满屏的 await,async ????,时代在变,我们也得跟上。

以上是关于如何为 .NET Core 3.0 中 WPF 配置依赖注入 ?的主要内容,如果未能解决你的问题,请参考以下文章

在.NET Core 3.0中的WPF中使用IOC图文教程

NET Core 3.0中的WPF

.NET Core 3.0 发布 ARM64

.Net Core 3.0 关于Windows Form和WPF的全面支持

如何为 .NET Core 重命名 ABP 中的列?

.NET Core 3.0新特性