【问题标题】:Inversion of control use from an MVVM client app来自 MVVM 客户端应用程序的控制反转使用
【发布时间】:2012-03-09 21:30:26
【问题描述】:

所以,我正在启动一个新的企业项目,并希望从使用 IoC 容器开始。到目前为止,该项目包含一个 MVVM WPF 客户端和 4 个其他程序集(CRM、ReportManager、安全管理器和存储库管理器程序集)。

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

考虑到每次我需要使用程序集时都要对它们进行初始化是相当重复的,而且(正如我在这里读到的)使用单例并不是一个好主意。如果我使用 IoC 容器(我正在考虑 Windsor)很好,如果它,我需要如何管理容器实例本身?我需要创建一个单例容器实例还是只在另一个类 (MainView) 上初始化容器以保证我能够从另一个类使用其注册的组件?

【问题讨论】:

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


    【解决方案1】:

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

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

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

    更新

    你说你有一个外壳,它有一系列选项卡,每个选项卡显示一个用户控件。

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

    如果您使用的是视图模型优先方法(您可能应该这样做),那么视图模型所需的服务(例如报表管理器、安全管理器等)应该通过其构造函数注入到视图模型中(作为已针对容器中的具体实现注册的抽象)。

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

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

    【讨论】:

    • 我了解 devdigital,但我该如何解决子控件的依赖关系?
    • 我不确定您所说的子控件是什么意思。您是否正在构建一个直到运行时才知道类型的复合应用程序?
    • 我的意思是我如何(正确)访问容器。我是否需要将其公开为根元素属性,在本例中为 MainView,以便执行 container.Resolver...
    • 谢谢,没这么想。
    猜你喜欢
    • 2014-03-19
    • 1970-01-01
    • 2021-07-11
    • 2017-11-19
    • 1970-01-01
    • 2011-07-31
    • 2018-08-22
    • 1970-01-01
    • 2021-01-27
    相关资源
    最近更新 更多