代码之家  ›  专栏  ›  技术社区  ›  Shrike

MEF:如何为合同执行手动配置导出

  •  3
  • Shrike  · 技术社区  · 15 年前

    我有一个MEF的CompositionContainer、一个contract(比如IFoo)和一个module(Prism module,但这里没什么关系,只是一些组件)。 我想在我的模块中注册契约的实现(FooImpl)。

    如果是团结,我会这样做:

    unity.RegisterType<IFoo, FooImpl>().
    

    这就是全部。 和我在一起我很困惑。我必须用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 as IFoo contract不依赖FooImpl类上的ExportAttribute。 FooImpl对其他组件/服务具有构造函数依赖性,我希望在创建时解决它们。

    所以我可能应该问:如何手动添加具有CompositionContainer实例和协定的导出?然后将此导出标记为具有ImportingConstructorAttribute?

    3 回复  |  直到 15 年前
        1
  •  0
  •   Wim Coenen    15 年前

    默认情况下,MEF不是这样工作的。但是,您可以创建自己的 ExportProvider 实现,并将其传递给 CompositionContainer

    这个 MEF contrib 这个项目有几个例子 export provider implementations Fluent Definition Provider 可能与你描述的最接近。还有一个提供与unity集成的导出提供者。

        2
  •  6
  •   Daniel Plaisted    15 年前

    看一看 AttributedModelServices.ComposeExportedValue . 您可以这样使用它:

    m_container.ComposeExportedValue<IFoo>(new IFooImpl());
    
        3
  •  1
  •   Daniel Plaisted    14 年前

    MEF的最新预览版本有一个名为RegistrationBuilder的类,您可以使用该类通过代码配置MEF部件。您可以从 MEF CodePlex site .

    这里有一个 blog post with an overview of the new features .

    推荐文章