2013-04-10 97 views
5

这个问题似乎已经被问了好几次了,但我还没有找到任何实际可行的答案。很简单,我如何从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容器中删除的东西?

+0

没错,那是一个死胡同。抱歉。 – Marc 2013-04-11 07:09:14

+0

CompositionContainer.ReleaseExport和ReleaseExports重载如何? – 2013-04-11 09:45:52

+0

ReleaseExport(s)只是在零件上调用IDisposable。如果该部分没有实现IDisposable,它将不会执行任何操作,并且在调用之后容器保持不变。 – meyousikmann 2013-04-12 12:58:29

回答