2012-07-04 65 views
6

我讀的依賴注入.NET馬克西曼,我不能爲我的生活讓我的頭部纏着此:DI控制狂反模式:唔明

雖然關鍵字是一個代碼氣味,當涉及到VOLATILE 相關性,你不必擔心使用它的穩定 相關性。 關鍵字一般不會突然「非法」,但您應該避免使用它來獲取VOLATILE 相關內容的實例。

也許這是因爲我仍然無法讓我的頭部纏繞環境作爲注入而不僅僅是一個全局變量,但我只是沒有得到作者的意思。

我真的很想了解DI從上到下,但現在我被卡住了,這只是通過本書的1/3 ... Control-Freak反模式似乎是每一個曾經住過的程序員...

任何人都有什麼見解?

+1

請參閱http://jamesshore.com/Blog/Dependency-Injection-Demystified.html。關於DI周圍有太多過於複雜的文章,雖然其實並沒有太多。我發現這篇文章頗有啓發:-)。 – helpermethod

回答

7

波動性(對我來說)是相似性的措施,一類將需要改變。

理想情況下,設計類是開放的擴展,但封閉修飾(開閉原則)。這並不總是可能的。那些接近變化的類別比其他類型更不穩定。

NDepend的(一個.net靜態分析指標工具)有一個名爲Instability,在我的腦海裏的代名詞度量。 他們將其定義爲:

不穩定性(I):傳出耦合(Ce)與總耦合的比率。 I = Ce /(Ce + Ca)。這一指標是大會應對變化的彈性指標。此度量標準的範圍爲0到1,其中I = 0表示完全穩定的裝配,I = 1表示完全不穩定的裝配。

你不想要穩定的類依賴不太穩定的類。

至於決定注入與否,這聽起來更像是一個類的角色問題。從域驅動設計(DDD)類通常是實體(他們有身份),服務(他們編排事物)或價值觀(他們是不可變的和可比較的,如紅色或100毫升)。

您會注入服務,您可以在值上調用新值。實體通常來自存儲庫(您注入的),但在內部,存儲庫會對它們調用新的。這有幫助嗎?

1

通常DI容器將所有依賴關係解析爲具體實現並處理您的生命週期。但是DI Control-Freak做對面:使用new關鍵字創建具體對象,僅注入它們並自己處理生命時間。因此,沒有其他人可以配置和處理代碼之外的依賴關係。因此,通過提供其他實現或假貨來重新使用或測試它。

下面是從@標記SEEMANN的書,那回答您的問題引文:

我把它命名爲控制狂描述一類不會 其依賴的放棄控制權。

出現這種情況,每次我們通過使用新的密鑰 - Word中創建一個類型的新實例時。當我們這樣做時,我們明確指出我們將控制實例的生命週期,並且沒有其他人會有機會截獲該特定對象。

1

我還沒有聽說過這些條款,但轉置了我所瞭解的依賴注入,我將它們定義如下。

穩定的依賴關係是一個穩定的依賴關係,它的具體實現不會隨着時間或不同情況在類或配置中發生變化。

易失性依賴關係是一種易失性依賴關係,其具體實現可能隨着時間或不同情況在類或配置中發生變化。

如果你可以原諒Java中的一個例子,穩定的依賴將是StringBuilder。如果您正在編寫構建字符串的方法,則不需要注入StringBuilder,您可以創建它。同上ArrayList,HashMap等。除了標準庫類以外,如果你正在編寫一個銀行應用程序,你可能不會注入一個RunningTotaliser,因爲這是一個爲你添加數字的對象。在標準庫揮發性依賴性

實例是很難拿出。一個典型的例子是DataSource - 這是一個封裝數據庫連接細節的對象,而這些對象幾乎肯定不會由實際建立連接的代碼提供。