gpt4 book ai didi

mef - 使用 CompositionBatch 对象从 CompositionContainer 中移除部件

转载 作者:行者123 更新时间:2023-12-04 20:25:18 25 4
gpt4 key购买 nike

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

我想做的是有一个开关,可以删除所有 与接口(interface)关联的当前部分,并在它们的位置上,仅用一个实现替换它们。我一直在尝试使用 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 发生变化以反射(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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com