C# MVVM中的传递服务
我真的很喜欢依赖注入的想法。但我在应用这个概念时遇到了困难,因为我看到的大多数示例都是针对ASP.NET MVC的 这里是我得到的:WPF->Services->Repository。服务被注入存储库,我的视图模型(至少有一个)被注入服务 然后在我的WPF App.xaml中,我覆盖了OnStartup方法。这就是我创建Ninject并解决第一个视图的地方 当涉及到多个视图时,我会迷失方向。例如,假设我将ServiceA和ServiceB注入我的第一个视图模型(在App.xaml中)。比如说,我希望在另一个视图模型的构造函数中使用ServiceC,我如何将它注入到构造函数中 用代码来说,是这样的:C# MVVM中的传递服务,c#,wpf,mvvm,dependency-injection,C#,Wpf,Mvvm,Dependency Injection,我真的很喜欢依赖注入的想法。但我在应用这个概念时遇到了困难,因为我看到的大多数示例都是针对ASP.NET MVC的 这里是我得到的:WPF->Services->Repository。服务被注入存储库,我的视图模型(至少有一个)被注入服务 然后在我的WPF App.xaml中,我覆盖了OnStartup方法。这就是我创建Ninject并解决第一个视图的地方 当涉及到多个视图时,我会迷失方向。例如,假设我将ServiceA和ServiceB注入我的第一个视图模型(在App.xaml中)。比如说,我
public class ViewModel1
{
private readonly IServiceA serviceA;
private readonly IServiceB serviceB;
public ViewModel1(IServiceA serviceA, IServiceB serviceB)
{
this.serviceA = serviceA;
this.serviceB = serviceB;
}
public void OpenASettingsWindow()
{
// How do I resolve this view?
var window = new View(new ViewModel2(new ServiceC()));
}
}
您需要一个创建
视图
实例的工厂。工厂构造函数将具有ServiceC
参数。然后需要将工厂注入到ViewModel1
。
下面的代码基于您的代码。理想情况下,ViewModel1
不需要了解任何有关View
类的信息-它应该处理更抽象的接口,如IWhateverWindow
,它可以有Show
等方法
public class ViewFactory
{
private ServiceC _serviceC;
public VewFactory(ServiceC serviceC)
{
_serviceC = serviceC;
}
public View CreateView()
{
return new View(new ViewModel(_serviceC));
}
}
public class ViewModel1
{
private readonly IServiceA serviceA;
private readonly IServiceB serviceB;
private ViewFactory _viewFactory;
public ViewModel1(IServiceA serviceA, IServiceB serviceB, ViewFactory viewFactory)
{
this.serviceA = serviceA;
this.serviceB = serviceB;
_viewFactory = viewFactory;
}
public void OpenASettingsWindow()
{
// How do I resolve this view?
var window = _viewFactory.CreateView();
}
}
直接在ViewModel的代码中创建视图是对MVVM原则的主要违反。ViewModels应该不知道视图。有许多方法可以以MVVM方式打开窗口。你可以在这里看到其中的一些