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

2024-03-25

我有一个基于 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(使用前将#替换为@)

使用 CompositionBatch 对象从 CompositionContainer 中删除部件 的相关文章

随机推荐