譯 依賴注入在多模組工程中的應用

2021-09-24 07:04:26 字數 2901 閱讀 4973

譯文出自:掘金翻譯計畫

譯者:mirosalva

校對者:jasonz,wenny

讓我以鳥瞰圖的形式快速回顧一下 plaid 的樣子。

class designernewsinjector 

}複製**

雖然這是乙個非常好的解決方案,但我們還是手工編寫了大量的樣板**。

在任何需要注入的地方,我們都需要在合適的時機呼叫底層函式,大多數情況下不是在物件初始化時就是在 oncreate 方法中。

依賴注入基本上意味著你不用在你需要的地方建立它們,而是在別的地方建立。然後這些物件的引用可以被傳遞到需要使用它們的類中。

這點可以通過自己編寫或者整合某個依賴注入庫來實現,我們選擇了整合 dagger 2。多虧了 dagger,為了獲取乙個可以使用的已初始化的 service,我們所有要做的就是如下內容:

@inject lateinit var service: designernewsservice

複製**

所有對 service 的依賴可以變成 provides 函式的傳參。我們為依賴注入需求選擇了 dagger 意味著我們的依賴圖在編譯階段會被建立。下面的章節中要記住這一點。

當我們決定引入 dagger 到 plaid 應用時,我們已經學到了寶貴的一課,尤其是對模組化。

不要試圖一次就覆蓋太多內容。

這意味著花一些時間研究清楚實現乙個新功能的最小必要範圍是有意義的。我們接下來要討論的 mvp,即在團隊內部審視我們是否在向著正確的方向前進。堅持這種做法可以防止我們進行太大而無法高效利用的變更。這也允許我們在整個**庫中逐步推出更改,與此同時每個人的任務也可持續進行。

在 plaid 應用內我們使用已驗證後的about功能模組作為 dagger 的練習模組。這裡我們可以新增 dagger 而不會干擾到其他模組或負載。你可以在這裡檢視初始提交。

當為乙個單塊應用引入依賴注入庫時,通常整個應用有個單一的依賴圖。

這可以使元件間共享依賴。在一些庫中,依賴可以被設定作用域來避免衝突,或者為被注入物件提供一種特殊的實現。

對乙個模組化應用,簡單的依賴圖通常大致長成下面這樣。

更具體的是,plaid 中元件規劃圖看起來像這樣。

還有乙個包含共享依賴項的元件,它位於core庫中並被稱作corecomponentcorecomponent背後的主要思想是提供可被整個應用使用的物件。它結合了一些 dagger 模組,這些模組位於core庫並可以在整個應用中復用。

() companion object

}複製**

使用乙個擴充套件函式可以使 this 更好地訪問:

複製**

@component(modules = [...], dependencies = [corecomponent::class])

inte***ce searchcomponent

}複製**

在生成的daggersearchcomponent做初始化時我們像這樣設定了corecomponent

daggersearchcomponent.builder()

.corecomponent(activity.corecomponent())

// modules

.build()

.inject(activity)

複製**

這裡的技巧是把corecomponent設定為searchcomponent的乙個依賴:

@component(

modules = [searchmodule::class],

dependencies = [corecomponent::class]

)inte***ce searchcomponent : baseactivitycomponent複製**

corecomponentsearchcomponent的乙個依賴。當corecomponent像上面那樣被引用為searchcomponent的乙個元件依賴時,所有的corecomponent方法可以在searchcomponent中使用,或者在其他 dagger 元件中使用,就好像他們變成註解@provides標記的方法。

這樣做的的乙個好處是:在功能圖中無需重複@modules,卻可以通過corecomponent或其他與之繫結的模組來透明地提供出去。

例如,coredatamodule繫結在corecomponent中,並提供retrofit等。retrofit例項現在可以被任何與corecomponent合併的元件訪問到。

讀完這篇文章,你可以看到模組化你的應用需要把依賴注入考慮進去。引入的功能模組邊界通過分離的依賴圖反映在依賴注入中。意識到這個限制可有助於為共享元件找到合適的位置。

你可以深入到**中來檢視我們如何使用 dagger 解決 plaid 中的依賴注入問題。

也是,因為它沒有太多的外部依賴。

如果發現譯文存在錯誤或其他需要改進的地方,歡迎到 掘金翻譯計畫 對譯文進行修改並 pr,也可獲得相應獎勵積分。文章開頭的本文永久鏈結即為本文在 github 上的 markdown 鏈結。

譯 依賴注入在多模組工程中的應用

譯文出自 掘金翻譯計畫 譯者 mirosalva 校對者 jasonz,wenny 讓我以鳥瞰圖的形式快速回顧一下 plaid 的樣子。class designernewsinjector 複製 雖然這是乙個非常好的解決方案,但我們還是手工編寫了大量的樣板 在任何需要注入的地方,我們都需要在合適的時...

依賴注入之Dagger2框架在工程中的使用

在介紹dagger2之前,了解一下使用dagger2的背景 一般情況下,例項man包含到例項car,則例項man依賴例項car。如下圖1 這種直接依賴的情況存在不好的情況,若car建構函式變化,則需要直接修改man類。使用依賴注入用於實現控制反轉的常用方式。控制反轉的基本思想是 借助 第三方 實現具...

c MVC 在工程中應用的實際處理

1.把collection放到另外乙個專案中。新增一類別庫 classlibrary1,在此類別庫中,定義所有的collection 2.在webmvc的專案中引用此類別庫。為了正常使用,需要在此專案中的global.asax檔案中,做如下定義。public static void register...