我试图弄清楚内核如何处理它的对象。例如,以下代码创建两个范围,并断言当示波器相同时,相同的对象是解决的。
[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单元的示例。