如何在WPF应用程序中组合MVVM和dependency injection?

您能否举例说明如何使用(您最喜欢的)DI框架为WPF应用程序连接MVVM View Models?

您是否会创建一个强连接的View Models层次结构(例如,每个嵌套控件的ViewModel是父ViewModel上的属性,并将它绑定到XAML中的嵌套控件的DataContext),或者您将使用某种更抽象的“”查看模型“管理器”,它维护一些弱连接的层次结构……就像在CAB中一样,也许?

如果视图模型只能与另一个一起存在,我会建立一种强大的关系。 这就是拥有视图模型将直接引用一个或多个从属视图模型。 另一方面,如果视图模型应该能够存在或不存在另一个模型,我采用松耦合方法,通过事件总线进行通信。

在使用DI与MVVM方面,绝对可以将两者结合起来。 它很简单:

public class MyViewModel { private readonly IMyDependency _myDependency; public MyViewModel(IMyDependency myDependency) { _myDependency = myDependency; } } 

但是,请注意,这假定了MVVM的“视图模型优先”方法,这有其缺点。

在WPF中,它通常非常简单,并且它并不真正依赖于任何特定的DI容器。 你有没有读过Josh Smith关于MVVM的文章 ? 它几乎描述了如何设置ViewModel的层次结构。

它没有涉及的是如何从依赖项(例如存储库)创建那些ViewModel,但这并不是一个很难的推断。

我经常经历过,抽象工厂的自由使用在这方面有很大帮助。 我没有直接刷新ViewModels,而是让注入的工厂为我做。

您可以使用穷人的DI或任何类型的DI容器为您连接这些工厂。

我在Code Project上发表了关于如何使用MVVM和MEF进行可扩展性的可扩展WPF应用程序的文章。 但是,如果仔细观察,我也会将MEF用于DI。

该应用程序完全是MVVM,只使用DataTemplates(偶尔使用Window),就像在Josh Smith的文章中一样。 WPF负责为您正确的ViewModel应用正确的View。 好可爱。

它使用MEF使零件可以相互“找到”。 因此,“视图”菜单项的ViewModel使用扩展点找到应该在子菜单中的所有菜单项,并且每个菜单项的ViewModel“找到”它们应该使用它们传递给布局管理器的ViewModel作文点。 他们还使用基本服务定位器(MEF)“找到”布局管理器服务。 View菜单示例几乎就是您所讨论的嵌套ViewModel。 很酷的是他们甚至在运行之前都不知道彼此。