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

标签 mef

我有一个基于 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/

相关文章:

c# - MEF无属性方法: lazy initialization by condition

c# - 如何改进 C# 中 get 调用方法的代码

c# - 从 MEF 容器中移除

c# - 将 MEF 与企业库一起使用

.net - Visual Studio 2010 插件撰写文章/教程?

C#、MEF - 签署受信任的插件以减少滥用

c# - Caliburn.Micro + MEF + 现代用户界面 : IContent events

c# - Visual Studio 2010 扩展获取选定的文本

.net - MEF 导出程序集中的自定义配置部分

parameters - 如何通过向 MEF 中的导出器传递参数来导入零件?