MEF:如何为合同实施手动配置导出

Shr*_*ike 3 .net mef

我有一个MEF的CompositionContainer,一个契约(比如IFoo)和一个模块(Prism模块,但这里没什么关系,只是一些组件).我希望在我的模块中注册合同的实现(FooImpl).

如果它是Unity我会这样做:

unity.RegisterType<IFoo, FooImpl>().
Run Code Online (Sandbox Code Playgroud)

就这样.有了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) {}
}
Run Code Online (Sandbox Code Playgroud)

在Initialize中,我希望manualy 导出 FooImpl,因为IFoo合约不依赖于FooImpl类的ExportAttribute.我知道我只能创建一个实例FooImpl(在上面的MyModule.Initialize中),但是FooImpl对其他组件/服务有构造函数依赖关系,我希望它们在创建时得到解析.

所以我可能会问:如何手动添加具有CompositionContainer实例和合同的导出?然后以某种方式标记此导出,因为它具有ImportingConstructorAttribute?

Dan*_*ted 6

看看AttributedModelServices.ComposeExportedValue.你会像这样使用它:

m_container.ComposeExportedValue<IFoo>(new IFooImpl());
Run Code Online (Sandbox Code Playgroud)