2012-09-13 53 views
2

我目前正在測試一些項目的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! 
} 

回答

2

這是因爲Ninject會嘗試構建您的對象,即使它沒有綁定。如果它有一個無參數的構造函數,它將使用它,否則它將嘗試使用容器中的依賴項構造它。

爲了證實這一點,即使你跳過MyServiceType的初始綁定,還是做一個TryGet,你會得到一個實例。

或者,你可以嘗試解決該實例已綁定和釋放後,並聲稱他們是同一類的不同逸岸實例。

+0

謝謝,這確實是這種情況。我確實嘗試了後一種測試,並且我認爲出於某種原因綁定仍然被緩存在某處。我猜想我的失敗是因爲我認爲綁定必須存在才能讓ninject實例化,但我更喜歡這種行爲。 –

+0

@MonroeThomas曾經有一種方法可以控制自己的隱藏自我綁定是通過'NinjectSettings'啓用的。我相信它仍然存在,但如果你想關閉它,可能會略微移動。 –

+0

@RubenBartelink謝謝;我會尋找的。 –