我有一个基于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的组合完成后初始化模块。 此外,在创建服务的实现之前,我需要执行一些复杂的初始化逻辑,我不希望它在构造函数中。
那么,我的选择是什么?
答案 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 :(得分:0)
我的MEF用法有点生疏,但这些想法可能有用。如果您的属性属于concreate实现类型,但是您通过指定接口的合同导出属性(我认为它类似于以下内容),该怎么办:
[Export(IService1)]
public Service1Impl Service1 {get; private set}
然后,每个对IService1接口进行导入检查的模块都将从该模块获得具体实现(这是对接口进行编码的主要目标)。
我希望这能引导你朝着正确的方向前进。
谢谢, 达米安