如何为 .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 配置依赖注入 ?的主要内容,如果未能解决你的问题,请参考以下文章