【问题标题】:Global DI container in WPFWPF 中的全局 DI 容器
【发布时间】:2014-05-21 03:40:13
【问题描述】:

我发现在 WPF 中,通常不可能只在复合根目录中使用 DI 容器。我在根目录中设置了所有依赖项,但我发现需要实例化根本无法在根目录中实例化的视图模型。

以选项卡中的自定​​义控件或在新窗口中生成的自定义控件为例。当视图激活时,它们的视图模型需要由视图本身实例化。我的许多视图模型都需要一个对话框提供程序,我将其作为接口注入到 VM 构造函数中。

我没有将 DI 容器用作服务定位器。我坚信构造函数注入,但正如我所说,我发现需要使用 DI 容器来实例化远超出复合根的视图模型。到目前为止,我一直在使用一个静态类来承载我可以在整个应用程序中使用的 DI 容器。

我只是想知道你们是如何解决这个问题的?

【问题讨论】:

    标签: wpf dependency-injection


    【解决方案1】:

    我不是 DI 专家,但我知道您不应该在“BootStrapper”或“Composition Root”之外的任何地方使用“DI 容器”。

    所以回答您的问题:由于某种原因,如果您无法在“Composition Root”中创建 Type 的实例,您始终可以使用 Abstract Factory pattern

    Take a look at thisImplementing an Abstract Factory

    【讨论】:

    • 当然。您可以创建一个提供对象的工厂并将其作为依赖项注入。这意味着工厂需要额外的代码,降低可读性,我们能得到什么?我们放松了对 DI 容器的依赖。恕我直言,努力与收益无关。还是我错过了什么?
    • 这可能感觉有点难做,而且你可以通过ServiceLocator 轻松获得多余的东西,但mark seemann 认为这是Anti Pattern。你不能说它不值得,一旦你这样做了,你就会真正感受到你的代码库。阅读此评论,这是来自abstract factory pattern 的受益者。所以 IMO 真的很值得这样做,它实际上让你的代码更加明显和干净。
    猜你喜欢
    • 2011-09-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-25
    • 1970-01-01
    • 2011-05-28
    • 1970-01-01
    • 2011-03-24
    • 1970-01-01
    相关资源
    最近更新 更多