如何从CompositionContainer取消注册ComposablePart

时间:2012-11-29 14:00:52

标签: c# memory-leaks mef composition

我正在使用带有静态CompositionContainer的MEF。我的类使用这个容器:

public void SomeClass
{
    [Import(typeof(AnotherClass)]
    private AnotherClass Instance {get;set;}

    public SomeClass()
    {
        MEFContext.RegisterAttributedPart(this); // this basically calls CompositionContainer.ComposeParts(this);
    }
}

现在的问题是,SomeClass的实例永远不会被释放,因为CompositionContainer会保留一个实例。我怎么能释放这个实例?

其他信息:

  • AnotherClass有一个PartCreationPolicy和CreationPolicy.Shared

2 个答案:

答案 0 :(得分:0)

CompositionContainer实现了IDisposable。您是否在CompositionContainer上调用Dispose或使用模式并释放对它的引用?

答案 1 :(得分:0)

在.NET 4中,MEF的使用实现似乎不支持子容器和过滤的目录。我通过创建一个新容器并使用仅包含必要项目的目录解决了上述问题。当我不再需要它时,该容器被丢弃。在.NET 4.5中,这可以通过子容器来解决。