我目前正在測試一些項目的IoC框架,我很樂意能夠使用Ninject 3.如何解除Ninject 3中的具體自綁定單例綁定?
我遇到了一個問題,在配置綁定到具體類型的單例之後,我似乎無法在以後有效地取消綁定服務類型。即StandardKernel.TryGet<T>()
在調用StandardKernel.Unbind<T>()
後返回一個非空值。請參閱下面的代碼段,瞭解我的確切用法。
這是在Ninject 3中的錯誤,或者是有什麼我失蹤?
作爲一種變通方法,我可以簡單地重新綁定具體類型爲恆定空值。但我更願意理解,如果在我退回到那個位置之前我沒有做些什麼。
順便說一句,如果我指定綁定到單範圍內的具體類型的接口,但不適合在單身範圍內綁定具體類型的自我預期解除綁定的作品。如果這不是一個錯誤(和額外的業力),你能解釋爲什麼行爲有差異嗎?
public class MyServiceType : IDisposable
{
public bool IsDisposed { get; private set; }
public void Dispose()
{
IsDisposed = true;
}
}
static void Main(string[] args)
{
var kernel = new StandardKernel();
kernel.Bind<MyServiceType>().ToSelf().InSingletonScope();
var instance = kernel.TryGet<MyServiceType>();
Debug.Assert(instance != null && !instance.IsDisposed);
// release the instance
kernel.Release(instance);
Debug.Assert(instance.IsDisposed);
instance = null;
// unbind the service
kernel.Unbind<MyServiceType>();
// uncomment below for workaround
// kernel.Rebind<MyServiceType>().ToConstant((MyServiceType)null);
// after unbinding should no longer be able to get an instance of the service
instance = kernel.TryGet<MyServiceType>();
Debug.Assert(instance == null); // <---- this is failing!
}
謝謝,這確實是這種情況。我確實嘗試了後一種測試,並且我認爲出於某種原因綁定仍然被緩存在某處。我猜想我的失敗是因爲我認爲綁定必須存在才能讓ninject實例化,但我更喜歡這種行爲。 –
@MonroeThomas曾經有一種方法可以控制自己的隱藏自我綁定是通過'NinjectSettings'啓用的。我相信它仍然存在,但如果你想關閉它,可能會略微移動。 –
@RubenBartelink謝謝;我會尋找的。 –