2016-06-29 79 views
0

我想弄清楚內核如何處理它在其中的對象。例如,下面的代碼創建兩個作用域,並聲明當作用域相同時,同一個對象被解析,而當作用域不同時作用不同。在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兩個實例。

  • 如何\何時這些被刪除?
  • 如何擴展我的測試以證明容器中的球被丟棄?

回答

2

Ninject保留WeakReference範圍。如果ninject不在(有效 - INotifyWhenDisposed)通知範圍結束,它將定期檢查範圍是否仍然存在。如果它已經死了,它將處理屬於該範圍的範圍內的資源。

通過嘲笑IDisposable並驗證Dispose()是否在預期時被調用來測試處理是否正常工作。測試垃圾回收可以通過使用JetBrains'dotMemory Unit來完成。

欲瞭解更多信息,請參閱my extensive answerthis question。該問題還顯示瞭如何使用dotMemory Unit的例子。