对象生命周期

本文关键字:周期 生命 对象 | 更新日期: 2023-09-27 18:10:39

我有一个单独的类Foo:

using System;
using System.ComponentModel.Composition;
namespace MefTest
{
    [Export]
    internal class Foo 
    {
        public Foo()
        {
            Console.WriteLine("created foo");
        }
        ~Foo()
        {
            Console.WriteLine("Dead");
        }            
    }
}

它是这样创建的:

using System;
using System.ComponentModel.Composition.Hosting;
using System.Reflection;
namespace MefTest
{
    internal class Program
    {
        public static void Main()
        {
            var catalog = new AggregateCatalog();
            catalog.Catalogs.Add(new AssemblyCatalog(Assembly.GetExecutingAssembly()));
            var container = new CompositionContainer(catalog);
            //EDIT: my problem, this returns Lazy<Foo> not Foo. Since I didn't call foo1.Value it was never actually created
            var foo1 = container.GetExport<Foo>(); 
            container.ReleaseExport(foo1);
            foo1 = null;
            GC.Collect();
            Console.Read();
        }
    }
}

但它似乎永远不会被处理掉。我试着给它添加一个不可能的接口,但没有任何运气。

我怎样才能确保这个被正确地清理?我原以为ReleaseExport会这样做,但是析构函数从来没有被调用过,所以它似乎从来没有被清理过。

我已经阅读http://mef.codeplex.com/wikipage?title=Parts%20Lifetime,但我似乎看不到上面代码的问题。

对象生命周期

您的问题是Foo是共享导出。如果您希望按原样处理它,您可以在其上实现IDisposable,然后在容器上调用Dispose

另一个选择是将Foo标记为非共享,这将导致ReleaseExport调用它的Dispose方法。

[Export]
[PartCreationPolicy(CreationPolicy.NonShared)]
internal class Foo 
{
    public Foo()
    {
        Console.WriteLine("created foo");
    }
    ~Foo()
    {
        Console.WriteLine("Dead");
    }            
}

在您提供的链接的"作用域操作和早期资源回收"一节中对上述内容进行了很好的解释。只要记住,如果您不提供PartCreationPolicy属性,导出将默认共享。