在Ninject内核中处理超出范围的对象

时间:2016-06-29 16:45:24

标签: ninject ninject-3

我正在试图弄清楚内核如何处理它所拥有的对象。例如,下面的代码创建了两个范围,并断言当范围相同时,同一个对象会被解析,当它不同时,它们会被解析。

[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 个答案:

答案 0 :(得分:2)

Ninject会在范围内保留WeakReference。如果ninject没有(主动 - INotifyWhenDisposed)通知范围结束,它将定期检查范围是否仍然存在。如果它已经死了,它将处理属于该范围的作用域资源。

可以通过模拟IDisposable并验证在预期时调用Dispose()来测试处理是否正常。可以使用JetBrains'dotMemory Unit来测试垃圾收集。

有关详细信息,请参阅my extensive answerthis question。该问题还显示了如何使用dotMemory Unit的示例。