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

时间:2010-09-24 13:32:12

标签: mef

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

我希望能够做的是有一个开关,用于删除 ALL 与界面关联的当前部件,并且只需一个实现就可以替换它们。我一直试图用CompositionBatch对象来做这件事,但它似乎不起作用。这是我正在做的一个例子:

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

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

然后我有我的容器:

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

现在将包含代表Foo1Foo2的部分。我想要做的是用另一个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部分,他会看一下实现过滤ExportProvider(可能更接近我需要做的事情)。

2 个答案:

答案 0 :(得分:5)

因此,CompositionBatch是关于添加和删除显式对象实例的,并且没有连接到目录,这是关于添加一组定义(如果愿意,也称为类型),然后将其构建到CatalogExportProvider中的对象实例中。要执行您想要的操作,您需要实际过滤到目录,然后再将其传递给容器以排除所需的类型。 (有关过滤目录的示例,请参阅http://mef.codeplex.com/wikipage?title=Filtering%20Catalogs。)

然后,如果你想添加一个显式的Foo实例,你可以使用CompositionBatch。

答案 1 :(得分:1)

蒂姆,你是否希望在创建容器之后,即在容器已经组成一些部分之后,在运行时动态地执行此操作?或者您是否尝试在启动时简单地应用过滤器?