为什么模块中没有MEF-container?

Eug*_*nov 6 containers prism mef

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

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

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

cho*_*dze 6

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

在DI的最佳实践中(本书很酷,我强烈推荐它)在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;
    }
}
Run Code Online (Sandbox Code Playgroud)

不要忘记在Boostrapper中注册您的MEF容器:

public class YourBootstrapper: MefBootstrapper
{
    protected override CompositionContainer CreateContainer()
    {
        var container = base.CreateContainer();
        container.ComposeExportedValue(container);
        return container;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 如果我们不应该知道容器,那么模块如何注册新的共享服务? (2认同)