我有一个基于MEF的解决方案,它有几个导出的接口实现.
我希望能够做的是有一个开关,删除与界面相关的所有当前部件,取而代之的是只用一个实现替换它们.我一直试图用一个CompositionBatch对象做这个,但它似乎不起作用.这是我正在做的一个例子:
[Export(typeof(IFoo)]
public class Foo1 : IFoo
{ }
[Export(typeof(IFoo)]
public class Foo2 : IFoo
{ }
Run Code Online (Sandbox Code Playgroud)
然后我有我的容器:
var container = new CompositionContainer(....);
Run Code Online (Sandbox Code Playgroud)
现在将包含代表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);
Run Code Online (Sandbox Code Playgroud)
我期待container.Catalog.Parts改变以反映我的变化,但事实并非如此.它与首次创建容器时保持一致.
我错过了什么?这甚至是正确的方法吗?我已经阅读了Glenn Block关于使用ExportProviders的CodeBetter文章,但他提到他将编写第2部分,其中他将介绍如何实现过滤ExportProvider(可能更接近我需要做的事情).
根据这个问题的答案,CompositionBatch和目录之间的区别是什么?这表明在一些其他组件构建对象的情况下,使用组合批处理非常有用.这让我想到,它适用的现实生活中的例子是什么?然后我开始考虑那些你无法控制的物体.如果无法添加未标记为Export的部件,您将如何将这些实例添加到容器中?我唯一想到的是设置一个具有所需类型成员的类,并将其标记为导出.
如果未将实例标记为导出,是否可以将其添加到容器中?