Удаление объектов вне области видимости в ядре Ninject
Я пытаюсь выяснить, как ядро избавилось от объектов, которые в нем есть. Например, следующий код создает две области действия и утверждает, что один и тот же объект разрешается, если область действия одинакова, а другая - различна.
[Test]
public void DisposingScope()
{
var kernel = new StandardKernel();
ScopeObject scopeObject = null;
kernel.Bind<IBall>().To<RedBall>().InScope(context => scopeObject);
var scope1 = new ScopeObject();
var scope2 = new ScopeObject();
scopeObject = scope1;
var ball1A = kernel.Get<IBall>();
var ball1B = kernel.Get<IBall>();
Assert.That(ball1A, Is.SameAs(ball1B)); // <== Balls from the same scope
scopeObject = scope2;
var ball2 = kernel.Get<IBall>();
Assert.That(ball2, Is.Not.SameAs(ball1A)); // <== Balls from different scopes
}
Поскольку у меня есть две области, есть два случая RedBall
проводится в контейнере.
- Как \ когда они удаляются?
- Как я могу продлить мой тест, чтобы доказать, что шары в контейнере утилизированы?
1 ответ
Ninject сохраняет WeakReference
в сферу. Если ninject не получает (активно - INotifyWhenDisposed) информацию о завершении области, он будет периодически проверять, остается ли область еще активной. Если он мертв, он будет распоряжаться ресурсами, относящимися к этой области.
Проверка правильности работ по утилизации может быть выполнена путем IDisposable
и проверка того, что Dispose()
был вызван, когда ожидалось. Тестирование сборки мусора может быть выполнено с помощью модуля JetBrains dotMemory.
Для получения дополнительной информации см. Мой обширный ответ на этот вопрос. Вопрос также показывает пример использования модуля dotMemory.