2016-06-29 2 views
0

Я пытаюсь выяснить, как ядро ​​удаляет объекты, которые у него есть. Например, следующий код создает две области и утверждает, что один и тот же объект решает, когда область видимости одна и та же, другая, когда она отличается.Устранение объектов вне зоны в ядре 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, занимаемые в контейнере.

  • Как \ когда они удаляются?
  • Как продлить мой тест, чтобы доказать, что шары в контейнере расположены?

ответ

2

Ninject сохраняет за собой WeakReference. Если ninject не является (активно - INotifyWhenDisposed), сообщается о завершении области, он будет периодически проверять, остается ли область видимости. Если он мертв, он будет обладать ограниченными ресурсами, относящимися к этой области.

Проверка правильности работы утилизации может быть произведена путем издевательства над IDisposable и подтверждения того, что Dispose() был вызван, когда ожидается. Тестирование сбора мусора можно сделать, используя JetBrains 'dotMemory Unit.

Для получения дополнительной информации см. my extensive answer - this question. В этом вопросе также показан пример использования модуля dotMemory.

Смежные вопросы