我有一个基于MEF的解决方案,它有几个导出的接口实现。
我希望能够做的是有一个开关,用于删除 ALL 与界面关联的当前部件,并且只需一个实现就可以替换它们。我一直试图用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部分,他会看一下实现过滤ExportProvider(可能更接近我需要做的事情)。
答案 0 :(得分:5)
因此,CompositionBatch是关于添加和删除显式对象实例的,并且没有连接到目录,这是关于添加一组定义(如果愿意,也称为类型),然后将其构建到CatalogExportProvider中的对象实例中。要执行您想要的操作,您需要实际过滤到目录,然后再将其传递给容器以排除所需的类型。 (有关过滤目录的示例,请参阅http://mef.codeplex.com/wikipage?title=Filtering%20Catalogs。)
然后,如果你想添加一个显式的Foo实例,你可以使用CompositionBatch。
答案 1 :(得分:1)