我有一个基于 MEF 的解决方案,其中有多个接口的导出实现。
我想要做的是有一个开关可以删除ALL与接口关联的当前部分,并用一个实现替换它们。我一直在尝试这样做CompositionBatch
对象,但似乎不起作用。这是我正在做的一个例子:
[Export(typeof(IFoo)]
public class Foo1 : IFoo
{ }
[Export(typeof(IFoo)]
public class Foo2 : IFoo
{ }
然后我就有了我的容器:
var container = new CompositionContainer(....);
现在将包含代表的部分Foo1
and 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 关于使用 ExportProviders 的 CodeBetter 文章 http://codebetter.com/glennblock/2008/11/30/export-providers-and-custom-factories-with-mef/,但他提到他将编写第 2 部分,其中他将考虑实现一个过滤 ExportProvider(这可能更接近我需要做的事情)。
因此 CompositionBatch 是关于添加和删除显式对象实例,并且不连接到目录,这是关于添加一组定义(如果您愿意的话,也称为类型),然后将其构造为 CatalogExportProvider 中的对象实例。要执行您想要的操作,您需要在将其传递到容器以排除您想要的类型之前实际过滤到目录。 (看http://mef.codeplex.com/wikipage?title=Filtering%20Catalogs http://mef.codeplex.com/wikipage?title=Filtering%20Catalogs有关过滤目录的示例)。
然后,如果您想添加显式 Foo 实例,您可以使用 CompositionBatch 来实现。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)