2010-11-02 41 views
3

我有一個.net 4.0 WCF服務,我正在嘗試安裝ninject。我爲ninject下載了WCF extension,並查看了TimeService示例。一切都看起來很簡單,但我看不出ninject如何正確地完成它的工作,因爲有一個無參數的構造函數手動注入依賴項。Ninject WCF擴展TimeService示例如何工作?

public TimeService() 
    : this(new SystemClock()) 
{ 
} 

public TimeService(ISystemClock systemClock) 
{ 
    _systemClock = systemClock; 
} 

據我所知,此代碼將永遠不會使用ninject綁定。如果我不提供任何參數,第一個構造函數將調用第二個構造函數。當在測試中,我傳入我的模擬對象時,第二個構造函數將被調用。對於WCF和ninject,我都很新,所以如果我錯過任何明顯的東西,我會很抱歉!

任何人都可以解釋嗎?

感謝

回答

2

默認情況下,Ninject將選擇具有參數的數量最多,它有足夠的綁定信息來填充構造。所以如果Ninject模塊能夠提供ISystemClock實現,Ninject會更喜歡第二個構造函數。

你在這裏展示的模式,當你想允許依賴注入經常使用,但還是有一個合理的默認依傍在沒有特定的依賴。正如你指出的那樣,你可以提供自己的ISystemClock模擬時的單元測試,它給你確定的測試的優勢。同樣,如果你有一些理由要提供一個自定義ISystemClock實現,你可以對自己的Ninject模塊與匹配的結合。另一方面,對於大多數目的來說,SystemClock的實現可能是最好的一個,所以不是強迫你設置一個ISystemClock綁定以使類能夠正常工作,而是提供了一個替代的構造函數,使用SystemClock作爲默認實現。如果您尚未爲ISystemClock服務指定綁定,Ninject會回退此構造函數。

編輯

在這種特殊情況下,它沒有運行的原因是由於在TimeService類中的以下屬性:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)] 

我不完全明白一切是怎麼回事在這裏,但它以某種方式阻止Ninject被用來創建服務。如果你註釋掉這一行,它應該按預期工作。爲解釋

+0

謝謝,這是有道理的。然而,ninject結合不被調用的第二個構造和我測試這個使用另一個類實現ISystemClock。你使用過這個樣本嗎?它工作? – littlechris 2010-11-02 15:59:12

+0

@littlechris:我剛剛下載它,並想出了這個問題。看到我編輯的答案。 – StriplingWarrior 2010-11-02 18:21:54

+0

謝謝@StriplingWarrior! :) – littlechris 2010-11-03 09:17:43