在專案中怎麼靈活使用Dagger? | 掘金技術徵文

JessYan發表於2016-12-22
推薦:看到如此多的 MVP+Dagger2+Retrofit+Rxjava 專案, 輕鬆拿 star, 心動了嗎? 看到身邊的朋友都已早早在專案中使用這些技術, 而你還不會, 失落嗎?
MVPArms 是一個 MVP+Dagger2+Retrofit+Rxjava 可配置化快速整合框架(目前 Dagger 應用最複雜可配置化極強的整合框架), 自帶上萬字 文件 以及 一鍵生成 MVPDagger2 檔案等功能, 成熟穩定且已有上千個商業專案接入, 累計 5k+ star(全球第一 MVP 框架), 現在你只用專注於邏輯, 其他都交給 MVPArms, 快來構建自己的 MVP+Dagger2+Retrofit+Rxjava 專案吧!

前言

最近介紹Dagger的文章挺多的,大多介紹的都是用法和註解的意義,在附帶一個小Demo,把剛學習的開發者看的雲裡霧裡的,看完還是不知道怎麼結合在專案中使用?什麼時候在專案中用?在專案中的使用場景是什麼?

架構圖

在專案中怎麼靈活使用Dagger? | 掘金技術徵文

這是本人寫的MVP+Dagger框架MVPArms的架構圖,通過Dagger來為MVP提供所需要的一切類和介面,本框架的初衷是讓開發者更好的學習及使用此類開發模式,如果不理解為什麼要使用MVP+Dagger來開發專案,可以先看這篇文章

對比

之前我看了幾個使用MVP+Dagger+Retrofit開發,並且有一定star量的開源專案,所以對比了下我的框架,有以下幾點:

  1. 使用Dagger的場景太少了,大部分只是使用Dagger注入MVP類,並且有些Retrofit都是自己new,並沒有使用Dagger管理,甚至有些使用一次介面就**retrofit.create(ApiService.class)**一次,這個本可以使用Dagger將它作為單例來呼叫的

  2. 有一些設計的ComponentModule完全只是用來注入Activity和一些單例

@ActivityScope
@Component(modules = {ActivityModule.class},dependencies = {AppComponent.class})
public interface ActivityComponent {
    void inject(AActivity activity);
    void inject(BActivity activity);
    void inject(CActivity activity);
    ...
}
複製程式碼

只要多一個Activity,他就可以一直過載inject方法,於是就可以用一組component,module來為所有Activity注入,但是如果遇到Activity需要臨時注入一些其他的元件,並且每個Activity要注入的元件都不一樣,就沒辦法了,缺少靈活性

  1. 還是和第2條有關,如果只有一個Module,Dagger就無法根據每個Presenter的需要,提供多個不同的Model,比如這個Presenter使用過這個介面,並且快取已經在Model中寫好,其他Presenter如果也要用到這個介面,就可以直接重用這個Model,MVP最大的好處之一就是可以重用MP

  2. 有些沒有Model層,直接給Presenter注入Retrofit Api(有些是注入一個管理類,如果專案小介面少,這樣還不錯,但是有沒有想過專案一大,介面一多裡面就非常混亂),所有網路請求邏輯在Presenter中,如果現在需求變了,需要加入快取,就需要更改Presenter的邏輯,這樣就可能影響一些和這個功能無關的邏輯,如果有Model層,裡面持有請求網路和快取的功能類,這樣Presenter就不需要管,資料是從網路還是資料庫獲取的,Model層只用保證返回給Presenter的資料無誤,而Presenter只用專注於邏輯,這樣各自只用保證各自的職責,遮蔽細節,易擴充套件,出錯也好定位

如何用?

在專案中用到最多的就是向Presenter提供ViewModel的同時,在向每一層提供所需要的單例類,並且使用Dagger不斷的重用PresenterModel,其實Dagger本來就抽象,說再多不如直接看程式碼是怎麼實現的,然後照著模版直接在自己專案中使用,本文的主題不就是在專案中怎麼靈活使用Dagger嗎?那就直接在專案中找答案不是更快?

Launch?


Hello 我叫Jessyan,如果您喜歡我的文章,可以在以下平臺關注我?

相關文章