Android依赖注入: Dagger (Part 1)

来源:互联网 发布:浙江师范大学行知 编辑:程序博客网 时间:2024/05/16 07:49

Android依赖注入: Dagger (Part 1)

在这篇文章中我将会解释什么是依赖注入,它的主要目的是什么,如何在Android项目中通过Dagger来完成依赖注入,Dagger是我认为Android中最好的依赖注入实现.

这篇文章将会接着我上一篇关于Android MVP的文章,因为我知道你们很想看到在相同的项目中实现依赖注入,我相信他们能够很好地达到目的.

这第一部分将会讲一些基础知识.知道依赖注入是什么和它为什么存在是非常重要的,因为如果我们不清楚这些,我们会认为我们付出的努力收益并不大.

什么是依赖

如果我们想要注入依赖,那么我们首先需要知道什么是依赖.短话来说,依赖是我们代码中两个模块之间的耦合(模块在面向对象语言中,就是两个类),它们依赖通常是因为其中一个使用了另外一个来做一些事情.

为什么依赖是危险的?

从高层次对低层次的依赖是非常危险的因为我们耦合了它们,如果我们需要改变其中一个模块,我们必须得修改与其耦合的代码模块才可以.这对于我们想要创建可以测试的应用是非常不好的,因为单元测试需要当我们测试模块时,该模块与其他模块独立.为了测试,我们需要用模拟的模块替换这些依赖.想象一下下面的代码:

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

我们如何只测试doSomething()而不去测试doSomethingElse呢?如果测试失败了的话,我们怎么知道是哪个方法导致的失败呢?我们并不知道,并且如果doSomethingElse方法保存了一些数据到数据库中,或者执行了一些API调用就更糟了.所有我们写的‘new’都是硬依赖我们需要去避免.少些模块也并不是个解决方式,不要忘了单一责任原则

如何解决它呢?依赖注入

如果我们不能在一个模块中实例化另外一个模块,我们需要用其他的方法提供这些模块.你能想到怎么做吗?对,通过构造器.这就是依赖反转原则的意思.你不能依靠具体的模块,只能依靠抽象.(译注:在构造器中传入抽象类或者接口)

我们上一个例子的代码会是这个样子:

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

那么什么是依赖注入呢?

你已经知道了!它由传入构造器(注入它们)的依赖组成,为了将创造模块的任务从另一个i模块中提取出来.对象在令一些地方被实例化,并且在当前对象被创建时传入进来.

如果新的问题就来了,如果我们不能在模块中创建具体的模块,那么必须要有一个地方去实例化他们.而且,如果我们需要有一个非常多参数的构造器来接受这些依赖,那么代码会变得非常的脏乱,难以阅读,导致对象在我们应用中到处传来传去.这正是依赖注入解决的问题.

什么是依赖注入器

我们可以将它想象成在我们APP中一个专门负责给其他模块提供实例和注入依赖的模块.这是它基本的责任.创建模块的地点在我们app的一个点,而且我们对他它全部的控制.

最后…什么是Dagger?

Dagger是为低端设备设计的依赖注入器.大多数依赖注入器依靠反射区创建依赖注入.反射虽然是个好东西,但是在低端设备中非常的耗时,并且在旧版本中更为显著.然而Dagger使用预编译创建我们所有需要用的的类.这样就不用反射.Dagger虽然没其他依赖注入器那么强大,但是它是最有效率的.

Dagger只是为了测试吗?

当然不是!它使你的模块在其他app中复用更加简单,在本app中改变起来更容易.想一个例子,一个应用在测试中从本地取数据,在发布时通过api取数据.通过在不同的情况注入进不同的模块可以很容易的完成这个任务.

结论

我知道这篇文章有点难,但是我认为建立这些基础对于下一篇文章是非常重要的.我们已经知道什么是依赖,我们能够从依赖反转等到什么好处,并且如何通过依赖注入器实现它.

下一篇我们就要动手啦.敬请期待!

本文翻译自http://antonioleiva.com/dependency-injection-android-dagger-part-1/

0 0
原创粉丝点击