gpt4 book ai didi

prism - 为什么 MEF 容器在模块中不可用?

转载 作者:行者123 更新时间:2023-12-04 15:02:10 26 4
gpt4 key购买 nike

在我的 Prism 应用程序中,MEF 容器可通过 Container 属性从 Bootstrapper 类中获得。

但它不是来自类模块(IModule)。我只能通过 IServiceLocator 导入容器。

为什么?我认为针对具体技术使用通用接口(interface)是有意义的,但 Prism 4.1 指南要求我们不要使用 IServiceLocator(在 Considerations for Using IServiceLocator 中)。

最佳答案

我认为它不对应于 Prism 或 MEF,而是对应于依赖注入(inject)原则和一般的最佳实践。 (是的,我认为 MEF 不是 DI 容器,但在这里它几乎用作 DI 容器,所以我想在这里使用相同的做法)。

在 DI 的最佳实践中(this 这本书非常酷,我强烈推荐它)在 DI“工作流程”中有这样的步骤是件好事:

  • 注册所有必要的类型(在 Prism 中 - 通过 Bootstrapper.ConfigureCatalog() 方法)
  • 解析根对象(包含所有嵌套对象。在 Prism 中 - 通过 Bootstrapper.CreateShell() 方法)
  • 使用你的根对象
  • 释放你的根对象

  • 理想情况下,您不应再使用 DI 容器。您的代码不应该知道 DI 容器的存在(从这方面来看,Unity 确实是 DI 容器,因为您可以编写不知道使用 DI 容器的代码)。如果您的代码知道它 - 它取决于 DI 容器,这是一件坏事。

    PS。如果你想在你的模块中使用 MEF 容器(例如,因为你对 DI 范式不是很熟悉,或者你有一些非常具体的任务),你可以尝试这样的事情:
    [ModuleExport(typeof(YourModule))]
    public class YourModule : IModule
    {
    public static CompositionContainer CompositionContainer;

    [ImportingConstructor]
    public void YourModule(CompositionContainer container)
    {
    this.CompositionContainer = container;
    }
    }

    不要忘记在 Boostrapper 中注册 MEF 容器本身:
    public class YourBootstrapper: MefBootstrapper
    {
    protected override CompositionContainer CreateContainer()
    {
    var container = base.CreateContainer();
    container.ComposeExportedValue(container);
    return container;
    }
    }

    关于prism - 为什么 MEF 容器在模块中不可用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10814964/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com