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

标签 prism mef containers

在我的 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/

    相关文章:

    mvvm - Prism.StoreApps中不存在Prism MVVM ValidatableBindableBase

    python - Azure 容器应用程序能否从 0 变得更像 azure 函数?

    datetime - Ubuntu 16.04 镜像中的 Docker 时区

    c# - 在 .NET 中使用 MEF 仅获取必要的插件

    prism - 我在哪里向单个区域添加行为?

    kubernetes - 为什么 pod yaml 文件中的容器对象具有 "list value"而不是 "map value"

    c# - 从弹出窗口关闭 TabItem

    wpf - Prism 和 View 的多个实例

    c# - Prism WPF : Loading a User Control on Startup

    c# - 如何获取MEF中的所有方法