相关疑难解决方法(0)

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

我有一个基于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(可能更接近我需要做的事情).

mef

3
推荐指数
1
解决办法
3658
查看次数

MEF:在CompositionContainer中添加未标有[export]的部件

根据这个问题的答案,CompositionBatch和目录之间的区别是什么?这表明在一些其他组件构建对象的情况下,使用组合批处理非常有用.这让我想到,它适用的现实生活中的例子是什么?然后我开始考虑那些你无法控制的物体.如果无法添加未标记为Export的部件,您将如何将这些实例添加到容器中?我唯一想到的是设置一个具有所需类型成员的类,并将其标记为导出.

如果未将实例标记为导出,是否可以将其添加到容器中?

.net mef

3
推荐指数
1
解决办法
3192
查看次数

标签 统计

mef ×2

.net ×1