从MVVM客户端应用程序反转控制使用

时间:2012-03-09 21:30:27

标签: inversion-of-control castle-windsor ioc-container

所以,我正在开始一个新的企业项目,并希望从使用IoC容器开始。到目前为止,该项目包括一个MVVM WPF客户端和另外四个程序集(CRM,ReportManager,安全管理器和Repository Manager程序集)。

MVVM客户端界面基于Shell和一系列用户控件(在选项卡中加载)。在这些用户控件中,我需要实例化并调用一个或多个其他程序集,这就是我的问题。

鉴于每次我需要使用它们时初始化程序集是非常重复的,而且(正如我在这里读到的)使用单例并不是一个好主意。如果我使用IoC容器(我正在考虑Windsor)并且如果它,我该如何管理容器实例本身呢?我是否需要创建单例容器实例或只是在另一个类(MainView)上初始化容器,以保证我能够使用其他类中的注册组件?

1 个答案:

答案 0 :(得分:2)

您不应该在应用程序周围传递对容器的引用。 Don't call the container; it'll call you

您需要引用容器的唯一地方是composition root(应用程序引导的位置),以及任何工厂实现。

Castle Windsor支持typed factories,因此即使您的工厂也可以自动连接以使用您的容器。

<强>更新

你说你有一个shell,它有一系列标签,每个标签显示一个UserControl。

如果您正在使用MVVM,那么您将拥有视图模型和视图,并且可能每个UserControl都是一个绑定到底层视图模型的视图。

如果您正在使用视图模型第一种方法(并且您可能应该这样),那么视图模型所需的服务(例如报表管理器,安全管理器等)应该通过其构造函数注入到视图模型中(作为已根据容器中的具体实现注册的抽象。)

在您解析shell视图模型的时候(在组合根目录中),容器将自动注入shell视图模型所需的服务,因为它具有依赖关系链支持。这些shell依赖项还可能包含每个选项卡的视图模型。

每当您需要实例化其他视图模型时,父视图模型可以依赖于工厂类型,该工厂类型返回此新视图模型的实例。这些工厂类型需要引用您的容器,但正如我所提到的,在Castle Windsor(和其他IoC容器)的情况下,提供了对通过容器隐式解析的工厂类型的创建的支持。