我们刚开始学习软件工程的时候,经常会遇到这样的事情:软件应该符合SOLID原则。但是这句话到底是什么意思呢?让我们看看SOLID中每个字母在架构中的重要意义,例如:S——单一职责原则O——开闭原则L——里氏代换原则I——接口分离原则D——依赖倒置原则这也是核心概念依赖注入(dependencyinjection)。简而言之,我们需要提供一个类,该类具有实现其功能所需的所有对象。概述依赖注入听起来像是一个描述非常复杂事物的术语,但它实际上非常简单,正如您从这个例子中看到的那样:publicDependencyInjection(Dependencyd){this.d=d;}}正如我们所见,第一种情况我们在构造函数中创建依赖对象,但第二种情况它作为参数传递给构造函数,这就是我们所说的依赖注入(dependencyinjection)。这样做是为了让我们编写的类不依赖于特定依赖项的实现,而是可以直接使用它。参数传递的目标是构造函数,我们称之为构造函数依赖注入;或者某个方法,称为方法依赖注入:如果您想了解有关依赖注入的更多信息,请查看DanLew的精彩演讲,他实际上启发了本概述。在Android平台上,当我们需要一个框架来处理依赖注入这个特殊问题时,我们有不同的选择,其中最著名的是Dagger2。美国的移动支付公司),然后慢慢演变为由谷歌自己开发。Dagger1先开发出来,然后大G接手了这个项目,发布了第二个版本,做了很多改动,比如在编译时以注解为基础来完成它的任务。导入框架安装Dagger并不难,但是需要导入android-apt插件,将其依赖添加到项目根目录的build.gradle文件中:buildscript{...dependencies{...classpath'com.neenbedankt.gradle.plugins:android-apt:1.8'}}然后我们需要将android-apt插件应用到项目的build.gradle文件中,放在Android应用语句的下一行在文件的顶部:applyplugin:'com.neenbedankt.android-apt'这时候我们只需要添加依赖,然后我们就可以使用库及其注解(annotation):dependencies{...compile'com.google.dagger:dagger:2.6'apt'com.google.dagger:dagger-compiler:2.6'provided'javax.annotation:jsr250-api:1.0'}需要添加最后一个依赖,因为@Generated注解是在Android中尚不可用,但它是原生Java注释。要将依赖项注入Dagger模块,我们首先需要告诉框架我们可以提供什么(例如上下文)以及具体对象应该如何创建。为了进行注入,我们用@Module注释注释一个特定的类(以便Dagger识别它),查找用@Provide注释的方法,生成一个图,并返回我们请求的对象。看下面的例子,这里我们创建了一个模块,它会返回给我们ConnectivityManager,所以我们需要将Context对象传递给这个模块的构造函数。@ModulepublicclassApplicationModule{privatefinalContextcontext;publicApplicationModule(Contextcontext){this.context=context;}@Provides@SingletonpublicContextprovidesContext(){returncontext;}@Provides@SingletonpublicConnectivityManagerprovidesConnectivityManagerCT(Contextcontext){return(ServiceConnectivityManager.NEIT}CE}context.get很有意思的一点在Dagger中就是简单的注解一个方法提供一个单例(Singleton)就可以处理所有继承自Java的问题Components当我们有一个模块的时候,我们需要告诉Dagger我们要在哪里注入依赖:我们在一个组件中做依赖注入(Component),这是我们专门创建的一个特殊的注解接口,我们在这个接口中创建不同的方法,接口的参数就是我们要注入依赖的类,这里举个例子,告诉Dagger我们要的是MainActivity类接受ConnectivityManager(或图中的任何其他依赖对象)。我们只是做一些像这样:@Singleton@Component(modules={ApplicationModule.class})publicinterfaceApplicationComponent{voidinject(MainActivityactivity);}正如我们所见,@Component注解有几个参数,一个是支持模块的数组,表示它可以提供。这里它可以是Context或ConnectivityManager,因为它们在ApplicationModule类中声明。用法此时,我们要做的就是尽快创建组件(比如在应用的onCreate阶段)并返回,然后类就可以使用它来注入依赖:为了让框架自动生成DaggerApplicationComponent,我们需要构建工程让Dagger扫描我们的代码,生成我们需要的部分。在MainActivity中,我们要做的两件事是用@Inject注解注解我们要注入的属性,并调用我们在ApplicationComponent接口中声明的方法(请注意,后面这部分会根据我们使用的注入类型而有所不同更改,但为了简单起见,我们在这里不关心它),然后注入依赖项,我们可以自由使用它们:getComponent().inject(this);}}总结当然,我们可以手动注入依赖关系并管理所有不同的对象,但是Dagger消除了模板等很多“噪音”,并为我们提供了有用的补充(例如Singleton),并且只用Java来做是不好的。
