我认为TypedFactoryInterceptor存在内存泄漏。
请考虑以下情况:
[Factory]
public interface IMyFactory
{
MySingleton GetInstance();
}
[Singleton]
public class MySingleton
{
}
[Singleton]
public class MyController
{
public MyController(IMyFactory factory)
{
// using a for loop to simulate repeated calls to the factory instance over
// a long time
for(int i = 0; i < 100000; i++)
{
var instance = factory.GetInstance();
}
}
}
在上面的例子中,TypedFactoryInterceptor将包含一个100000 WeakReferences的列表,所有这些WeakReferences都指向同一个Target实例(MySingleton)。因此,在一个单例依赖于工厂来创建另一个单例的实例的情况下,最终可能会有数十万个WeakReferences,从而导致内存泄漏。
在查看源代码时,看起来问题就在这里(在TypedFactoryInterceptor.Resolve中):
// this is called on every Resolve call to the TypedFactory (IMyFactory.GetInstance)
if (this.kernel.ReleasePolicy.HasTrack(instance))
{
// there will not be any dead references because MySingleton is a Singleton
this.CollectDeadReferences();
// adds another WeakReference to the same Singleton instance
this.resolvedTrackedComponents.Add(new WeakReference(instance));
}
有什么想法吗?
感谢。
答案 0 :(得分:1)
这是因为WeakReference
是Windsor 2.5中架构限制的一种解决方法,而不是一个完整的解决方案。
这已在(即将推出的)Windsor 3中修复,其中不涉及WeakReference
。
作为一种临时解决方法,我猜你最好的选择是不要为那个单身人士使用工厂(或升级到Windsor 3)。