【发布时间】:2013-04-10 11:54:28
【问题描述】:
这个问题似乎已经被问过好几次了,但我还没有找到任何真正有效的答案。很简单,我如何从 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,而 root 显然不是。其他简单示例显示了如何创建部件和移除部件,但会记住对已创建部件(作为 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.Lazy' 到 'System.ComponentModel.Composition.Primitives.ComposablePart' C:\Users\irbldr.CORP\Documents\Visual Studio 2012\Projects\ConsoleApplication4\Program.cs
如果我直接使用上面链接的文档中的代码,我得到的错误完全相同。
有没有办法简单地从 MEF 容器中删除一些东西?
【问题讨论】:
-
没错,那是一条死胡同。对不起。
-
CompositionContainer.ReleaseExport 和 ReleaseExports 重载怎么样?
-
ReleaseExport(s) 只是在部件上调用 IDisposable。如果部件没有实现 IDisposable,它什么也不做,调用后容器保持不变。