Prism + MEF:延迟了prism-module的服务导出

时间:2010-09-09 19:05:04

标签: prism mef

我有一个基于Prism(v4 ctp)和MEF的应用程序。 该应用程序有一个服务IService1。我希望这个服务实现是由某个模块导出的(不仅仅是由MEF发现)

public interface IService1 {}
public class Service1Impl: IService1 {}

Service1Impl没有ExportAttribute。这是因为我想在我的Prism模块中手动创建实现:

[ModuleExport(typeof(SomeModule))]
[PartCreationPolicy(CreationPolicy.Shared)]
public SomeModule: IModule
{
    [Export]
    public IService1 Service1 {get; private set}

    public void Initialize()
    {
        Service1 = new Service1Impl();
    }
}

在其他一些组件中,我希望通过MEF Import获得IService1的实现。 问题是如何告诉MEF在Prism调用Initialize后进行导出(在SomeModule中)?

如果我在模块的构造函数中创建服务的实现,那么一切正常,但它与Prism的模块初始化过程不一致。 问题是Prism在MEF的组合完成后初始化模块。 此外,在创建服务的实现之前,我需要执行一些复杂的初始化逻辑,我不希望它在构造函数中。

那么,我的选择是什么?

2 个答案:

答案 0 :(得分:1)

您是否尝试过ModuleDependency?我需要对MEF做更多的研究,但在Prism中,你可以保证一个Module的Initialize通过ModuleDependency在其他模块之前触发。

例如,如果您在Initialize期间有SomeOtherModule需要IService1,那么您可以确保以这种方式初始化SomeModule。

[ModuleDependency("SomeModule")]
public class SomeOtherModule : IModule
{
    [Import]
    public IService1 Service1 {get; set;}

    public void Initialize()
    {
        //This ought to be populated now.
        Service1.DoSomething();
    }
}

我完全符合条件,说我可能不知道MEF的某些内部工作不允许这样做,但这就是Prism的工作原理。

顺便说一句,当我看到一个依赖,无论是明确的还是隐含的,我都会问自己:

  1. 该服务是否会被多个模块使用?那么将服务推广为在Bootstrapper中构建并由托管应用程序而不是另一个模块提供的东西是否有意义?
  2. 如果不是#1,如果模块之间存在依赖关系,这些模块在逻辑上是否相同?他们应该合并吗?如果一个人不能没有另一个人,没有理由不将它们结合起来。
  3. 无论如何,最后这只是要考虑的事情。

    希望这有帮助。

答案 1 :(得分:0)

我的MEF用法有点生疏,但这些想法可能有用。如果您的属性属于concreate实现类型,但是您通过指定接口的合同导出属性(我认为它类似于以下内容),该怎么办:

[Export(IService1)]
public Service1Impl Service1 {get; private set}

然后,每个对IService1接口进行导入检查的模块都将从该模块获得具体实现(这是对接口进行编码的主要目标)。

我希望这能引导你朝着正确的方向前进。

谢谢, 达米安