我有一个基于 MEF 的解决方案,它有一个接口(interface)的多个导出实现。
我想做的是有一个开关,可以删除所有 与接口(interface)关联的当前部分,并在它们的位置上,仅用一个实现替换它们。我一直在尝试使用 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
发生变化以反射(reflect)我的变化,但事实并非如此。它与首次创建容器时相同。
我错过了什么?这甚至是正确的方法吗?我读过 Glenn Block's CodeBetter article on using ExportProviders ,但他提到他将编写第 2 部分,其中他将着眼于实现过滤 ExportProvider(这可能更接近我需要做的)。
最佳答案
因此,CompositionBatch 是关于添加和删除显式对象实例,而不是连接到目录,目录是关于添加一组定义(如果您愿意,也可以称为类型),这些定义随后会在 CatalogExportProvider 中构建到对象实例中。要做你想做的事,你需要在将它传递给容器之前实际过滤到目录以排除你想要的类型。 (有关过滤目录的示例,请参阅 http://mef.codeplex.com/wikipage?title=Filtering%20Catalogs)。
然后,如果您想添加一个明确的 Foo 实例,您可以为此使用 CompositionBatch。
关于mef - 使用 CompositionBatch 对象从 CompositionContainer 中移除部件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3787594/