从MEF容器中移除

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容器中移除某些内容的方法?

真的,那是个死胡同。抱歉。 - Marc
CompositionContainer.ReleaseExport和ReleaseExports重载怎么样? - Panos Rontogiannis
ReleaseExport(s) 只是在部件上调用 IDisposable。如果该部件没有实现 IDisposable,则不执行任何操作,并且在调用后容器保持不变。 - meyousikmann
1个回答

0

这个链接可能会有帮助:如何在更改部件时使MEF重新组合?

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接