2011-02-23 49 views
2

我剛剛爲別人提出了以下模式。當我想要爲測試注入依賴關係的能力時,我已經使用了它幾次,但仍然希望外部人員能夠看到這個後門(有點)。因此,空公共構造函數和內部構造函數的說法:TDD /注入與信息隱藏之間的戰鬥 - 可能的妥協?

public class ClassThatUseInjection 
{ 
    private readonly SomeClass _injectedClass; 

    public ClassThatUseInjection(): this(new SomeClass()) {} 

    internal ClassThatUseInjection(SomeClass injectedClass) 
    { 
     _injectedClass = injectedClass; 
    } 
} 


public class SomeClass 
{ 
    public object SomeProperty { get; set; } 
} 

我的想法是,既然空的構造函數什麼都不做,但有一個新的實例轉發,我的罪是不是太糟糕。你怎麼看?太臭了嗎?

問候, 莫滕

+0

在什麼情況下,你考慮DI後門? –

+0

我並沒有在這裏降低後門的價值:-)我喜歡注入,但有時注入顯而易見的代碼會降低可讀性。 – Morten

+0

Perhps你可以/應該說SomeClass也是內部的,而不是公共的。 – ChrisW

回答

3

我認爲這是確定。事實上,你在注入這個類時所做的是依賴注入和開放/封閉原則的實際應用。
我甚至沒有看到將內部控制器變成公共控制器沒有任何壞處。
我的問題總是,我不想強​​迫別人創建一個注入類的實例,因此,默認ctor。但是如果他們想創建一個實例,他們可以繼續並且這樣做。

相關提示:恕我直言,你應該使用一個接口,而不是一類,否則,我沒有看到在經過該類首先太大的優勢...

+0

感謝您的反饋意見。我總是使用一個接口,但是保持它的簡潔:-) – Morten

1

希望這個後門(有點)對外界不可見

使它成功做到這一點,國際海事組織。

不利的一面是它將您的測試放在同一個組件中。

另請參閱Hide public method used to help test a .NET assembly關於如果您的測試位於外部程序集中,如何隱藏公共方法。


編輯:你做了什麼特別合適的,如果SomeClass在邏輯上是內部...如果它是一個實現細節不應該/不需要在組裝的公共接口暴露出來。

+4

測試可以在單獨的程序集中,請參閱['InternalsVisibleToAttribute'](http://msdn.microsoft.com/zh-cn/ library/system.runtime.compilerservices.internalsvisibletoattribute.aspx) –

1

這就是所謂的「窮人的依賴注入」,如果你不能在你的應用中獲得一個合適的IOC容器,那麼它是一個合理的選擇,儘管你最好使用容器給你提供的能力。

吉米·博加德具有良好的寫了here

+0

我不認爲[that](http://www.lostechies.com/blogs/jimmy_bogard/archive/2010/05/20/the-religion-of-依賴注入.aspx)是一個'好'的寫作,因爲它是片面的。它沒有提到缺點,即它在public API中公開了IDinnerRepository的存在(而不是'隱藏'或'封裝'),即使'IDinnerRepository'可能是實現細節(私有或內部數據成員),大多數公共API用戶都不想知道這些信息。 – ChrisW

+0

@ChrisW不提什麼的缺點?它提到了這種注射的固有問題。他的論點肯定是沒有窮人的直接投資,但你認爲DI不應該用在這裏嗎? –

+0

沒有提到他所倡導的方面。他主張的是:a)在公共API中擁有IDinnerRepository;和b)刪除默認的構造函數。正如他所說,刪除默認構造函數的代碼很少,但是有一個缺點(他沒有提到):刪除默認構造函數的缺點是調用者必須知道一個IDinnerRepository實例,即使IDinnerRepository可能是一個實現細節。 – ChrisW