对象生命周期
本文关键字:周期 生命 对象 | 更新日期: 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属性,导出将默认共享。