我正在试图弄清楚内核如何处理它所拥有的对象。例如,下面的代码创建了两个范围,并断言当范围相同时,同一个对象会被解析,当它不同时,它们会被解析。
[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
实例。
答案 0 :(得分:2)
Ninject会在范围内保留WeakReference
。如果ninject没有(主动 - INotifyWhenDisposed)通知范围结束,它将定期检查范围是否仍然存在。如果它已经死了,它将处理属于该范围的作用域资源。
可以通过模拟IDisposable
并验证在预期时调用Dispose()
来测试处理是否正常。可以使用JetBrains'dotMemory Unit来测试垃圾收集。
有关详细信息,请参阅my extensive answer至this question。该问题还显示了如何使用dotMemory Unit的示例。