我有一个 MEF 的 CompositionContainer、一个契约(Contract)(比如 IFoo)和一个模块(Prism 模块,但在这里并不重要,只是一些组件)。 我想在我的模块中注册合约的实现 (FooImpl)。
如果是 Unity,我会这样做:
unity.RegisterType<IFoo, FooImpl>().
就是这样。 对于 MEF,我感到很困惑。我必须用 ExportAttribute 标记我的实现,但这会导致它自动导出。我想自己管理这个。 看一下代码:
class MyModule: IModule {
private CompositionContainer m_container;
public MyModule(CompositionContainer container) {
m_container = container;
}
public void Initialize() {
??? I want something like m_container.CreateExport<IFoo, FooImpl>()
}
}
public interface IFoo {}
public class FooImpl : IFoo {
//[ImportingConstructor]
public FooImpl(ISomeService svc) {}
}
在初始化中,我希望手动导出 FooImpl 作为 IFoo 合约,不依赖于 FooImpl 类上的 ExportAttribute。 我知道我可以创建一个 FooImpl 实例(在上面的 MyModule.Initialize 中),但是 FooImpl 对其他组件/服务具有构造函数依赖性,我希望它们在创建时得到解决。
所以我可能应该问:如何手动添加具有 CompositionContainer 实例和契约(Contract)的导出?然后以某种方式标记此导出,因为它具有 ImportingConstructorAttribute?
最佳答案
看看AttributedModelServices.ComposeExportedValue .你会像这样使用它:
m_container.ComposeExportedValue<IFoo>(new IFooImpl());
关于.net - MEF:如何为契约(Contract)实现手动配置导出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3493640/