Android中的依賴注入:Dagger函數庫的使用(一)

來源:互聯網
上載者:User

標籤:

——歡迎轉載,請註明出處 http://blog.csdn.net/asce1885 ,未經本人同意請勿用於商業用途,謝謝——

原文連結:http://antonioleiva.com/dependency-injection-android-dagger-part-1/

本文Gitbooks連結:http://asce1885.gitbooks.io/android-rd-senior-advanced/content/androidzhong_de_yi_lai_zhu_ru_ff1a_dagger_han_shu_ku_de_shi_yong_ff08_yi_ff09.html

在這個新系列中,我將解釋什麼是依賴注入,它的主要目的是什麼,以及在Android工程中如何Dagger函數庫實現它,Dagger是目前最流行的專為Android設計的依賴注入函數庫。

本文是之前的文章《Android中MVP的實現》的後續之作,因為我相信讀者中有一部分人會很樂意看到這兩個特性在同一個工程中實現,而且我認為它們可以很好的協同工作。

本文將僅介紹基本的理論知識來奠定基礎。理解依賴注入的概念以及它存在的理由是很重要的,否者我們會認為得到的好處不如付出的努力。

什麼是依賴注入

如果我們想要注入依賴,首先要理解依賴是什麼。簡單的說,依賴是我們代碼中兩個模組之間的耦合(在物件導向語言中,指的是兩個類),通常是其中一個模組使用另外一個提供的功能。

為什麼依賴是危險的?

從上層到底層依賴都是危險的,因為我們在某種程度上把兩個模組進行耦合,這樣當需要修改其中一個模組時,我們必須修改與其耦合的模組的代碼。這對於建立一個可測試的app來說是很不利的,因為單元測試要求測試一個模組時,要保證它和app中其他模組是隔離的。為了做到這一點,我們需要使用mocks代替依賴,想象一下這樣的代碼:

public class Module1{   private Module2 module2;   public Module1(){      module2 = new Module2();   }   public void doSomething(){      ...      module2.doSomethingElse();      ...   } }

如何在不測試doSomethingElse函數的前提下測試doSomething函數呢?如果測試失敗,是哪個函數導致的呢?我們不得而知。如果doSomethingElse函數在資料庫中儲存資料或者向伺服器端發起API請求,那麼事情將變得更加糟糕。

每當敲下new關鍵字我們都應該意識到這可能是需要避免的強依賴。編寫更少的模組當然不是解決方案,不要忘記單一職責原則。

如何解決呢?依賴反轉

如果不能在一個模組內部初始化另外的模組,那麼需要以其他的形式初始化這些模組。你能想象如何?嗎?沒錯,通過建構函式。這基本上就是依賴反轉原則的涵義了。你不應該依賴具體的模組對象,應該依賴抽象。

前面的代碼應該修改為:

public class Module1{   private Module2 module2;   public Module1(Module2 module2){      this.module2 = module2   }   public void doSomething(){      ...      module2.doSomethingElse();      ...   } }
那麼什麼是依賴注入呢?

你已經知道了!它通過建構函式傳遞依賴(注入),從而把建立模組的任務從另一個模組內部抽離出來。對象在其他地方建立,並以建構函式參數的形式傳遞給另一個對象。

但新問題出現了。如果我們不能在模組內部建立其他的模組,那麼必須有個地方對這些模組進行初始化。另外,如果我們需要建立的模組的建構函式包含大量的依賴參數,代碼將變得醜陋和難以閱讀,app中將存在大量傳遞的對象。依賴注入正是為解決這類問題而誕生的。

什麼是依賴注入器?

我們可以把它理解成app中的另一個模組,專門負責提供其他模組的執行個體並注入他們的依賴。這是它的基本義務。模組的建立集中於app中的一個統一的入口,我們對它有完全的控制權。

最後,什麼是Dagger?

Dagger是專為低端裝置設計的依賴注入器。大部分依賴注入器通過反射來建立和注入依賴。反射機制是很棒的,但在低端裝置上面耗時嚴重,特別是在老的android版本上面。然而,Dagger使用先行編譯器建立工作所需的所有類。這樣一來,就不需要用到反射了。Dagger相比其他依賴注入器功能稍弱,但卻是效率最高的。

Dagger只是用於測試嗎?

當然不是!它使得在其他app中重用你的模組變得容易,或者在相同的app中改變這些模組。想象這樣一個例子:你的app在debug模式下需要從本地檔案中讀取資料,而在release模式下需要從伺服器端API請求中擷取這些資料。完全有可能通過在不同的模式下注入不同的模組來實現。

結論

我知道這篇文章有點難度,但我認為在繼續下一篇文章之前,有必要把基本概念先明確好。我們已經知道什麼是依賴,通過依賴反轉改進了什麼以及我們如何通過依賴注入器實現它。

在下一篇文章中我們會開始真正的實踐操作,敬請關注!

——歡迎轉載,請註明出處 http://blog.csdn.net/asce1885 ,未經本人同意請勿用於商業用途,謝謝——

Android中的依賴注入:Dagger函數庫的使用(一)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.