2014-12-13 78 views
2

我想減少兩個組件之間的耦合,然後我想到dependency injection,但很長一段時間,我只是使用Spring來實現這一點。但是現在,我正在做一個不適合使用這個框架的項目(它太重了)。你可以給我一個沒有框架的依賴注入的例子嗎?

那麼你能舉個例子來爲我自己實現dependency injection嗎?

+0

Guice呢? – 2014-12-13 04:15:51

回答

2

Dependency Injection是一種無需框架支持即可輕鬆使用的模式。有些人甚至更喜歡沒有框架支持,但至少,框架是否真正有益取決於way you use such framework以及您正在構建/維護的應用程序的類型和大小。

依賴注入只是關於從外部注入依賴到一個組件。最常見和建議的方式是通過構造函數注入。這意味着一個類應該指定它的所有依賴作爲構造函數參數。

你應該總是設計你的代碼,就好像根本沒有DI框架;你的應用程序代碼應該忽略這種框架的存在。這意味着你不應該使用特定於框架的屬性來修飾你的代碼。他們污染你的代碼並導致供應商鎖定。如果您使用的DI庫需要使用屬性,請切換到其他庫。

依賴注入的使用將在整個應用程序中「冒泡」。這意味着一個應用依賴注入模式的類將把它的依賴創建的責任移到調用堆棧上。這意味着該類的消費者現在負責創建它的依賴關係。但是,由於該消費者也應該應用依賴注入,這意味着它再次推動創建依賴關係的責任。當所有類都應用依賴注入模式時,意味着需要在應用程序中的一個地方創建完整的對象圖。這實際上是一件好事。這個地方叫做composition root

同樣,您不需要使用DI庫(a.k.a. IoC容器),並且您的應用程序代碼絕對不應該依賴它。您應該應用依賴注入模式(和SOLID原則)以使您的應用程序可以維護。 DI庫可用於使您的組合根可維護,但只有在它使組合根更易於維護時才能使用它。不使用DI庫可爲您創建對象圖提供完整的編譯時支持。使用DI庫會讓你失去編譯時支持,所以它的優點應該超過失去編譯時支持的缺點。此外,您需要確保在應用程序啓動期間或至少在測試套件中驗證對象圖的構建。如果你的DI容器很難做到這一點,那麼切換你的庫或者手動構建你的對象圖可能是更好的選擇。

+0

「使用DI庫會讓你失去編譯時支持」現在對於Dagger 2的出現並不真正有效 – 2015-10-06 16:59:07

+0

@GauravVashisth A鏈接到描述這一點的文章將有所幫助。 – Steven 2015-10-06 17:26:15

+0

以下是一些http://google.github.io/dagger/ https://blog.gouline.net/2015/05/04/dagger-2-even-sharper-less-square/ – 2015-10-06 20:08:49