Удаление объектов вне области видимости в ядре 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.

Другие вопросы по тегам