2012-03-09 73 views
0

因此,我开始了一个新的企业项目,并希望从使用IoC容器开始。到目前为止,该项目由MVVM WPF客户端和4个其他程序集(CRM,ReportManager,Security Manager和Repository Manager程序集)组成。从MVVM客户端应用程序反向控制使用

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

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

回答

2

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

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

Castle Windsor支持typed factories,所以即使您的工厂可以通过自动连线来使用您的容器。

更新

你说你有一个外壳,具有一系列的标签,每个标签显示一个用户控件。

如果您使用的是MVVM,那么您将拥有视图模型和视图,并且大概每个这些UserControl都是一个有效的视图,它将绑定到基础视图模型。

如果您使用视图模型的第一种方法(您可能应该是),那么视图模型需要的服务(例如报表管理器,安全管理器等)应该通过其构造函数注入视图模型中(如一个已经在容器中的具体实现中注册的抽象)。

在解决您的shell视图模型(在您的组合根目录中)时,容器将自动注入shell视图模型因其依赖链支持而需要的服务。这些外壳依赖关系还可能包含每个选项卡的视图模型。

无论何时您需要实例化进一步的视图模型,父视图模型都可以依赖于返回此新视图模型的实例的工厂类型。这些工厂类型需要引用您的容器,但正如我所提到的,就Castle Windsor(和其他IoC容器)而言,为创建通过容器隐式解决的工厂类型提供了支持。

+0

我明白,devdigital,但我该如何解决从子控件的依赖关系呢? – 2012-03-09 21:44:55

+0

我不确定你的意思是由孩子控制。您是否构建了一个复合应用程序,其类型在运行时间之前是未知的? – devdigital 2012-03-09 21:47:35

+0

我的意思是我如何(正确)访问容器。我是否需要将它作为一个根元素属性公开,在这种情况下是MainView,以便执行container.Resolver ... – 2012-03-09 21:59:16