咨询区
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 ????,时代在变,我们也得跟上。