代码之家  ›  专栏  ›  技术社区  ›  Tim Roberts

使用CompositionBatch对象从CompositionContainer中删除零件

mef
  •  3
  • Tim Roberts  · 技术社区  · 14 年前

    我有一个基于MEF的解决方案,它有几个接口的导出实现。

    全部 CompositionBatch 对象,但似乎不起作用。下面是我正在做的一个例子:

    [Export(typeof(IFoo)]
    public class Foo1 : IFoo
    { }
    
    [Export(typeof(IFoo)]
    public class Foo2 : IFoo
    { }
    

    然后我有了我的容器:

    var container = new CompositionContainer(....);
    

    Foo1 Foo2 . 我想做的是,用另一个替换它们 IFoo 实施。这就是我正在尝试的,我认为这会奏效:

    var partsToRemove
       = from part in container.Catalog.Parts
           from exDef in part.ExportDefinitions
           where exDef.ContractName == AttributedModelServices.GetContractName(typeof(IFoo))
         select part.CreatePart();
    
    var batch = new CompositionBatch(null, partsToRemove);
    
    batch.AddPart(new Foo3());
    
    container.Compose(batch);
    

    container.Catalog.Parts

    我错过了什么?这是正确的方法吗?我读过 Glenn Block's CodeBetter article on using ExportProviders ,但他提到他将编写一个第2部分,其中将介绍如何实现一个过滤导出提供程序(这可能更接近于我需要做的事情)。

    2 回复  |  直到 13 年前
        1
  •  5
  •   Wes Haggard    14 年前

    因此CompositionBatch是关于添加和删除显式对象实例,而不是连接到catalog,它是关于添加一组定义(如果愿意,也可以称为类型),这些定义随后被构造到CatalogExportProvider中的对象实例中。要做您想做的事情,您需要在将目录传递到容器以排除您想要的类型之前实际地过滤到目录。(见 http://mef.codeplex.com/wikipage?title=Filtering%20Catalogs

        2
  •  1
  •   Glenn Block    14 年前

    Tim,您是否希望在创建容器之后,即容器已经组成了一些部分之后,在运行时动态地执行此操作?或者你只是想在启动时应用一个过滤器?

    推荐文章