从MEF容器中取出
本文关键字:MEF | 更新日期: 2023-09-27 18:08:21
这个问题似乎已经被问过好几次了,但我还没有找到任何实际有效的答案。很简单,我如何从MEF容器中取出东西。
即使在这里显示的代码https://mef.codeplex.com/wikipage?title=Parts%20Lifetime下AddPart/RemovePart不工作,因为它不会编译,因为它被列出。代码显示如下:
var catalog = new AssemblyCatalog(typeof(Program).Assembly);
var container = new CompositionContainer(catalog);
var root = new Root();
// add external part
container.ComposeParts(root);
// ... use the composed root instance
// removes external part
batch = new CompositionBatch();
batch.RemovePart(root);
container.Compose(batch);
这不会编译,因为调用RemovePart需要一个ComposablePart,而根显然不是。其他简单的示例展示了如何创建部件和删除部件,但是记住了对已创建部件的引用(如ComposablePart),因此删除仅使用该引用。我不想在创建容器时保持对容器中每个部分的引用,我只想在应用程序的任何任意点从容器中删除一部分,而不必在整个过程中保持对它的引用。
下面是我正在尝试做的事情,使用上面链接的文档中列出的完全相同的模式:
public class Program
{
[Import]
private IClass myClass;
public Program()
{
var container = new CompositionContainer(new AssemblyCatalog(Assembly.GetExecutingAssembly()));
container.ComposeParts(this);
var partToRemove = container.GetExport<IClass>();
var batch = new CompositionBatch();
batch.RemovePart(partToRemove);
container.Compose(batch);
}
public static void Main(string[] args)
{
var program = new Program();
}
}
但是这给了我以下编译错误:
参数1:不能从的系统。懒"System.ComponentModel.Composition.Primitives。ComposablePart"C:'Users'irbldr.集团文件' '视觉Studio 2012 ' ConsoleApplication4 ' '项目Program.cs
如果我直接使用上面链接的文档中的代码,我得到的错误完全相同。
有没有办法简单地从MEF容器中删除一些东西?
此链接可能会有所帮助:当我更改部分时,如何让MEF重新组合?
但是长话短说:你可以从MEF中删除一个实例,但是你不能删除一个导出定义,除非删除完整的目录,重新组合和过滤它(简单地不添加东西)。