我有一个基于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是关于添加和删除显式对象实例的,并且没有连接到目录,这是关于添加一组定义(如果愿意,也称为类型),然后将其构建到CatalogExportProvider中的对象实例中.要执行您想要的操作,您需要实际过滤到目录,然后再将其传递给容器以排除所需的类型.(有关过滤目录的示例,请参阅http://mef.codeplex.com/wikipage?title=Filtering%20Catalogs).
然后,如果要添加显式Foo实例,可以使用CompositionBatch.
| 归档时间: |
|
| 查看次数: |
3658 次 |
| 最近记录: |