这个问题似乎已经被问了好几次了,但我还没有找到任何实际可行的答案。很简单,我如何从MEF容器中删除某些东西。从MEF容器中删除
即使在AddPart/RemovePart下面显示的代码https://mef.codeplex.com/wikipage?title=Parts%20Lifetime也不起作用,因为它不会像列出的那样编译。代码显示了这一点:
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();
}
}
但是这给了我下面的编译错误:
Argument 1: cannot convert from 'System.Lazy' to 'System.ComponentModel.Composition.Primitives.ComposablePart' C:\Users\irbldr.CORP\Documents\Visual Studio 2012\Projects\ConsoleApplication4\Program.cs
这正是如果我直接从上面链接的文档中使用代码,则会得到同样的错误。
有没有办法简单地从MEF容器中删除的东西?
没错,那是一个死胡同。抱歉。 – Marc 2013-04-11 07:09:14
CompositionContainer.ReleaseExport和ReleaseExports重载如何? – 2013-04-11 09:45:52
ReleaseExport(s)只是在零件上调用IDisposable。如果该部分没有实现IDisposable,它将不会执行任何操作,并且在调用之后容器保持不变。 – meyousikmann 2013-04-12 12:58:29