在我的 Prism 应用程序中,MEF 容器可通过 Container 属性从 Bootstrapper 类中获得。
但它不是来自类模块(IModule)。我只能通过 IServiceLocator 导入容器。
为什么?我认为针对具体技术使用通用接口(interface)是有意义的,但 Prism 4.1 指南要求我们不要使用 IServiceLocator(在 Considerations for Using IServiceLocator 中)。
最佳答案
我认为它不对应于 Prism 或 MEF,而是对应于依赖注入(inject)原则和一般的最佳实践。 (是的,我认为 MEF 不是 DI 容器,但在这里它几乎用作 DI 容器,所以我想在这里使用相同的做法)。
在 DI 的最佳实践中(this 这本书非常酷,我强烈推荐它)在 DI“工作流程”中有这样的步骤是件好事:
理想情况下,您不应再使用 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/