从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重新组合?

但是长话短说:你可以从MEF中删除一个实例,但是你不能删除一个导出定义,除非删除完整的目录,重新组合和过滤它(简单地不添加东西)。

相关文章:
  • 没有找到相关文章