用于WPF的.NET Core 3.0中的依赖项注入

用于WPF的.NET Core 3.0中的依赖项注入,wpf,.net-core,.net-core-3.0,Wpf,.net Core,.net Core 3.0,我非常熟悉ASP.NET核心以及对依赖注入的即时支持。控制器可以通过在其构造函数中添加参数来要求依赖项。如何在WPF用户控件中实现依赖关系?我尝试向构造函数添加一个参数,但没有成功。我喜欢国际奥委会的理念,我更愿意把它提交给WPF 一般来说,你不会。在视图模型中使用依赖项注入,然后使用数据绑定将视图绑定到这些模型 这并不是说这是不可能的。例如,MVVM Light创建一个injector类,然后在App.xaml中声明它的一个实例,这与声明一个全局变量几乎相同: 可视树中的窗口和用户控件可以

我非常熟悉ASP.NET核心以及对依赖注入的即时支持。控制器可以通过在其构造函数中添加参数来要求依赖项。如何在WPF用户控件中实现依赖关系?我尝试向构造函数添加一个参数,但没有成功。我喜欢国际奥委会的理念,我更愿意把它提交给WPF

一般来说,你不会。在视图模型中使用依赖项注入,然后使用数据绑定将视图绑定到这些模型

这并不是说这是不可能的。例如,MVVM Light创建一个injector类,然后在App.xaml中声明它的一个实例,这与声明一个全局变量几乎相同:


可视树中的窗口和用户控件可以绑定到应用程序资源,因此在该框架中,主窗口通常绑定到视图模型,如下所示:


…其中,
Main
是定位器类的属性:

public Main视图模型Main
{
得到
{
返回ServiceLocator.Current.GetInstance();
}
}
这不是很好的IoC,因为它将所有的可注入项放在一个类中。实际上,你会把它分解成不同层次的专业工厂等

但说真的,不要这样做。在视图模型层中使用DI,并使用松散的数据绑定将其耦合到视图中。这将允许您充分利用依赖项注入的功能,部分是通过从不需要依赖项注入的层进行解耦,部分是通过允许灵活地为不同的环境(即web、桌面、移动)重新配置依赖项,特别是在根本不创建视图的单元测试中


(免责声明:我还没有将.NET Core用于WPF,因此我在这里介绍的内容可能有点特定于.NET,但一般原则仍然存在)。

好问题,如果xaml中没有非参数化构造函数,就不能有控件。如果需要,您需要从代码中实例化它,但xaml不会调用该构造函数。

在这种情况下,您必须使用代码隐藏。但是,如果确实需要在UserControl或从xaml实例化的任何其他类中具有依赖关系,请三思。

在WPF中,使用名为(简称MVVM)的模式。您的依赖项被注入视图模型(使用与您在ASP.NET中使用的相同的IoC框架,例如AutoFac),并且您的视图(用户控件)被注册为视图模型的数据模板


这样,您就可以围绕视图模型构建应用程序,并且视图(依赖于视图模型)被解析为视图模型依赖于视图。视图可以通过其DataContext属性访问其视图模型。因此,您可以使用视图模型作为外观,向视图中注入任何内容。

我最近在我的项目中遇到了这一需求,并通过这种方式解决了它

用于.NETCore3.0中WPF的依赖项注入。在解决方案中创建WPF Core 3项目后,需要安装/添加NuGet软件包:

Microsoft.Extensions.DependencyInjection
在我的例子中,我创建了一个名为LogBase的类,我想用它来记录日志,所以在应用程序类中,添加以下内容(这只是一个基本示例):

private readonly ServiceProvider\u ServiceProvider;
公共应用程序()
{
var servicecolection=新servicecolection();
配置服务(serviceCollection);
_serviceProvider=serviceCollection.BuildServiceProvider();
}
专用void配置服务(IServiceCollection服务)
{
AddSingleton(新的日志库(新的文件信息($@“C:\temp\log.txt”));
services.AddSingleton();
}
启动时专用void(对象发送方、StartupEventArgs e)
{
var mainWindow=_serviceProvider.GetService();
mainWindow.Show();
}
在App.xaml中,添加Startup=“OnStartup”,使其如下所示:



同时,有人问我如何在用户控件内使用注入。如果有人从中受益,我会提出这个解决方案。检查一下。

你可以参考这个答案@YantingChen这个例子展示了如何使用NInject,我希望找到一个使用.NET核心依赖项注入的例子。好的,所以我创建了一个依赖项为ISimulatorConnection的ViewModel。我使用内置的IOC容器,如何以及在何处构建ViewModel?这没有什么神奇之处。在合成根/程序条目中,您只需新建主窗口,并将其DataContext与主视图模型一起分配,您可以从IoC框架解析该模型,即
container.Resolve()
。自从DI成为主流以来,WPF并没有得到太多的维护。对于我正在做的项目类型来说,从代码实例化控件毕竟不是一个坏主意。