在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的实例。

  • 何时删除这些?
  • 如何扩展测试以证明容器中的球被处置?

ninject将WeakReference保留到范围。如果没有(积极地 - inotifywhendisposed)通知范围结束,它将定期检查范围是否还活着。如果已经死了,它将处置属于该范围的范围。

测试处理正确工作的测试可以通过模拟IDisposable并在预期时验证Dispose()来完成。可以使用Jetbrains的DotMemory单元进行测试垃圾收集。

有关更多信息,请参阅我对这个问题的广泛答案。该问题还显示了如何使用dotmemory单元的示例。

最新更新