由Dragger1淺析依賴注入

http://antonioleiva.com/dependency-injection-android-dagger-part-1/

這篇博客最主要的目的是以Dragger爲例子介紹一下DI(Denpendecy Injection 依賴注入)在Android應用的使用。

這篇文章接着我的上一篇博客 Android中的MVP實踐,我知道你們當中許多想試試Dragger融入其中會是怎樣一幅場景。

第一部分,我們來講一下依賴注入的理念,光知道依賴注入的好處對我們來說是遠遠不夠的。


1.什麼是依賴 ?

以來就是兩個代碼模塊之前的紐帶(在面向對象的語言,可以看作是我們的兩個類 ),通常是因爲其中一個類需要另一個類去做一些事情

2.爲什麼說依賴是不安全的呢 ?
一個從上級到下級的依賴是很不安全的,因爲我們用依賴將這些模塊連接在一起,當我們需要去修改其中一個上級的模塊時,我們必須要去修改和它有依賴關係的所有模塊代碼。

如果想要去做測試的時候,要求被測試的模塊是一個獨立於其它模塊的一個單獨模塊,因此,我們就必須模擬出那些我們所依賴的那些模塊,以便測試的時候,能夠將我們的精力專注在被測試模塊上,我們來看一個例子

public class Module1{
   private Module2 module2;

   public Module1(){
      module2 = new Module2();
   }

   public void A(){
      ...
      module2.B();
      ...
   } 
}

我們如何在不測試B()的前提下去測試A()?

如果測試失敗了,是A()有錯誤,還是B()有錯誤呢?我們都沒有辦法確定.

如果B()中包含一些對數據庫的操作或者包含一些API的回調接口,這樣情況會更加糟糕。

每一個“new”操作都是很強的依賴,我們要儘量避免使用或者不使用,減少模塊的數量不是解決方法,我們要記住單一職責原則(每一個模塊就完成一個操作)


1.如何去解決這些問題呢 ? 依賴倒置

如果我們不能在其它模塊的內部去實例化,那麼我們就需要利用另一種方式將我們提供給其它模塊使用,你能想到方法麼,不錯,使用構造函數就可以,這就是最簡單的依賴倒置手段,我們之前的代碼就可以修改成如下的樣子.

public class Module1{
   private Module2 module2;

   public Module1(Module2 module2){
      this.module2 = module2
   }

   public void doSomething(){
      ...
      module2.doSomethingElse();
      ...
   } 
}

2.那麼什麼是依賴注入呢?
其實你已經知道了,它就是通過我們用構造方法傳入的方式,將其它模塊所需要的任務模塊實例傳入。

這樣就出現了一個新問題,既然我們不能在其它模塊的內部創建實例,那麼我們就必須要在其它地方創建,除此之外,當我們的依賴變得很多時,我們就需要將構造函數寫的很龐大,這樣下來我們的代碼會變得非常冗餘而且很難閱讀,依賴注入器很好的解決了我們的這個問題

3.什麼是依賴注入器呢?
我們想象一下,在我們的應用中,存在這樣一個模塊,它是專門用來提供其它模塊的實例以及注入他們依賴的,這就是它最基本的職能。創建模塊是集中在我們應用程序中的一點,而且我們有完全的控制權。

4.什麼是Dagger
Dagger是一個爲低端設備設計的依賴注入器,大多數依賴注入器都是在反射的基礎上實現創建和依賴注入。
反射是極好的,但是在低端的設備上這是很耗費時間的,特別是在一下比較老的Android版本上。Dagger採用預編譯的方式來實現,它將需要使用到的類進行預編譯,這樣的話,我們就不需要反射了,Dagger雖然不是其它依賴注入器那麼強大,但是他確實最有效率的。

5.Dagger只是爲了測試使用麼
答案當時否定的,Dagger會幫助你更簡單的複用你的模塊,甚至在相同的應用程序中去改變他們,想象一下,例如我們在一個應用程序中有一個模塊的作用是將數據從本地文件讀入,或者是去拿到API服務的回調數據,Dagger都會使你能夠很簡單將他注入到另一個模塊上。


至此,我們已經瞭解了什麼是依賴,如何提高依賴倒置的效率,已經依賴注入器Dagger的使用,

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章