0

我试图弄清楚内核如何处理其中的对象。例如,下面的代码创建了两个作用域,并断言当作用域相同时解析同一个对象,如果不同则解析不同的对象。

[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容器中有两个实例。

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

1 回答 1

2

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

可以通过模拟IDisposable和验证Dispose()在预期时调用的方法来测试处理是否正常工作。可以使用 JetBrains 的dotMemory Unit来测试垃圾回收。

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

于 2016-06-30T05:51:48.217 回答