.net - MEF:如何为契约(Contract)实现手动配置导出

标签 .net mef

我有一个 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/

相关文章:

.net - Entity Framework (代码优先)继承映射 : mix of TPT and TPC

c++ - 如何在c++/cli中正确释放Bitmap的 'external'像素数据

c# - Windows 中的唯一文件标识符

asp.net-mvc - 动态加载程序集中的强类型 Razor View 不会在运行时编译

使用表达式的泛型类的 C# 加速方法调用

.NET 应用程序使用的 SQL View 超时

c# - 从 MEF 容器中移除

c# - 如何使用 VSTO 和 MEF 解决 ServiceLocator.Current 为空

c# - MEF导入解析

c# - 如何从未由 MEF 容器实例化的对象中导出部件