从MEF容器中取出

时间:2013-04-10 11:54:28

标签: c# mef

这个问题似乎已被问过几次,但我还没有找到任何实际有效的答案。很简单,我如何从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.Lazy'来   'System.ComponentModel.Composition.Primitives.ComposablePart'C:\ Users \ irbldr.CORP \ Documents \ Visual   Studio 2012 \ Projects \ ConsoleApplication4 \ Program.cs

如果我直接使用上面链接的文档中的代码,那么这是完全相同的错误。

是否无法简单地从MEF容器中移除某些东西?

1 个答案:

答案 0 :(得分:0)

此链接可能会有所帮助:How do I get MEF to recompose when I change a part?

但长话短说:您可以从MEF中删除一个实例,但是如果不删除完整的目录,则不能删除导出定义,重新组合并过滤它(只是不添加内容)。