天天看點

Android 之dragger使用

1、依賴的注入和配置獨立于元件之外,注入的對象在一個獨立、不耦合的地方初始化,這樣在改變注入對象時,我們隻需要修改對象的實作方法,而不用大改代碼庫。

2、依賴可以注入到一個元件中:我們可以注入這些依賴的模拟實作,這樣使得測試更加簡單。

3、app中的元件不需要知道有關執行個體建立和生命周期的任何事情,這些由我們的依賴注入架構管理的。

我覺得,dagger2這樣的依賴注入架構對mvp架構來說,是最好的解耦工具,可以進一步降低modle-view-presenter之間的耦合度。

是以,如果你的項目在使用mvp架構開發,強烈建議配合dagger2一起使用。

接下來,在貼代碼之前,我先說說明下我的mvp架構和傳統的mvp有些不同,傳統mvp的m層處理業務邏輯,p層僅僅是v和m的橋梁;而我的p層同時處理與model相關的業務邏輯,不處理view層次的邏輯,view層次的邏輯交給v自己處理,m層僅僅是bean,這種方式是根據開發中的實際情況而作的考慮,這裡先不作讨論。

先看結構圖:

Android 之dragger使用

接下來,分解這張圖:

appcomponent: 生命周期跟application一樣的元件。可注入到自定義的application類中,@singletion代表各個注入對象為單例。

appmodule: 這裡提供了appcomponent裡的需要注入的對象。

這裡細心的童鞋可能發現,為何有些方法直接傳回入參,有些需要傳回一個new的對象呢?

這裡如果對dbmanager的寫法換成:

這樣編譯不會通過,會報一個循環依賴的錯誤,這種寫法需要在傳回參數和入參不是同一個類的情況下才可以。感興趣的可以檢視dagger2生成的代碼。

對于直接傳回的類jobexecutor、retrofitmanager,它們類的構造函數一定要加上@inject的注解:

接下來談談activitycomponent,可以看到有個@activityscope注解,這個注解是自定義的,對應activity的生命周期,dagger2可以通過自定義注解限定注解作用域,一般在module裡規定scope的生命周期,比如下面的activityscope在activitymodule裡綁定。

activitycomponent:生命周期跟activity一樣的元件,這裡提供了inject方法将activity注入到activitycomponent中,通過該方法,将activity中需要注入的對象注入到該activity中。

activitymodule:注入activity,同時規定activity所對應的域是@activityscope

至此,注入工作初步完畢了,看到這裡,可能有童鞋有疑問,presenter(或者biz)的注入在哪裡,為何沒在activitycomponent裡?

是的,正常來說,結構圖應該是下面這張圖的樣子:

Android 之dragger使用

我建議使用這種方式,對于不同的activity,建立各個對應的activitycompontent,同時把presenter(biz)注入到component的視圖中,這也是dagger2推薦的做法,dagger 2希望使用@component注解接口将依賴關系連結起來。

而我的做法沒有把presenter注入到activitycomponent中,因為presenter的作用域和activity一樣,好處是節省代碼(- -),大家可以自行選擇注入方式。

使用:

其中loginpresenter:

文/yokey(簡書作者)

原文連結:http://www.jianshu.com/p/c2feb21064bb

著作權歸作者所有,轉載請聯系作者獲得授權,并标注“簡書作者”。