Я полагаю, что произошла утечка памяти с 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,все из которых указывают на один и тот же объект 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));
}
Есть мысли?
Спасибо.