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/
- Android依赖注入: Dagger (Part 1)
- Android依赖注入: Dagger (Part 2)
- Android依赖注入:Dagger(Part 3)
- Android 依赖注入之Dagger
- 【Android】【Dagger】Dagger2 依赖注入
- Dagger - 快速依赖注入器(for android and java) (1)
- Android 依赖注入(DI)框架 Dagger
- Android Dagger依赖注入框架浅析
- Android依赖注入:Dagger、RoboGuice和ButterKnife
- Android Dagger依赖注入框架浅析
- Android 依赖注入框架 Dagger 学习
- Android Dagger依赖注入框架浅析
- Android依赖注入库Dagger的使用
- Android依赖注入:Dagger、RoboGuice和ButterKnife
- Android Dagger依赖注入框架浅析
- Android依赖注入:Dagger、RoboGuice和ButterKnife
- Android —— Dagger依赖注入库
- Android依赖注入:Dagger、RoboGuice和ButterKnife
- SCU 4438 Censor KMP/哈希
- Codeforces Round #310 (Div. 1) D. Case of a Top Secret 二分 stl应用
- laravel 从route路由开始经过controller操作mysql数据库并返回结果显示在浏览器中 (select)
- R语言中两个数组(或向量)的外积如何计算
- C语言之基本算法31—杨辉三角
- Android依赖注入: Dagger (Part 1)
- 搬瓦工bandwagon vps centos 笔记
- 欢迎使用CSDN-markdown编辑器
- 如何做好div+css的浏览器兼容性
- PAT乙级 1010. 一元多项式求导
- mysql 行锁
- 单词翻转
- C语言之基本算法32—鞍点
- Storm常见问题及解决方案总结