5

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

4

1 回答 1

0

此链接可能会有所帮助:更改零件时如何让 MEF 重新组合?

但长话短说:您可以从 MEF 中删除一个实例,但您不能删除导出定义而不删除完整的目录、重组和过滤它(只是不添加一些东西)。

于 2013-05-31T08:10:02.837 回答