内容简介:本篇是对于在依赖注入 Dagger2 这篇文章中,我们了解了 Dagger2 是如何进行依赖注入的。可以简单的将Dagger2理解成android应用的依赖管理工具。既然Dagger2已经可以满足我们日常的开发需要了,那么Dagger-Android又是拿来干什么的呢?
写在前面
本篇是对于 使用Kotlin构建MVVM应用程序—第四部分:依赖注入 Dagger2 的补充。
在依赖注入 Dagger2 这篇文章中,我们了解了 Dagger2 是如何进行依赖注入的。
可以简单的将Dagger2理解成android应用的依赖管理工具。既然Dagger2已经可以满足我们日常的开发需要了,那么Dagger-Android又是拿来干什么的呢?
为什么要有Dagger-Android?
对于这个问题,google在 Dagger-Android 的文档上有解释:
我们普通的dagger代码如下所示:
public class FrombulationActivity extends Activity { @Inject Frombulator frombulator; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // DO THIS FIRST. Otherwise frombulator might be null! ((SomeApplicationBaseType) getContext().getApplicationContext()) .getApplicationComponent() .newActivityComponentBuilder() .activity(this) .build() .inject(this); // ... now you can write the exciting code } }
这会带来一些问题:
- 只是复制粘贴上面的代码会让以后的重构比较困难,还会让一些开发者不知道Dagger到底是如何进行注入的(然后就更不易理解了)
- 更重要的原因是:它要求注射类型(FrombulationActivity)知道其注射器。 即使这是通过接口而不是具体类型完成的,它打破了依赖注入的核心原则:一个类不应该知道如何实现依赖注入。
为了解决上述的问题,Dagger-Android应运而生。
Dagger-Android
首先我们需要在app/build.gradle加入相应的依赖
//dagger2 di implementation 'com.google.dagger:dagger:2.16' kapt 'com.google.dagger:dagger-compiler:2.16' //dagger-android implementation 'com.google.dagger:dagger-android:2.16' implementation 'com.google.dagger:dagger-android-support:2.16' kapt 'com.google.dagger:dagger-android-processor:2.16'
注入方法建议看 文档 更好,这里简单描述一下:
还是以 MVVM-android 为例。
- 添加ActivityModule.kt
@Module abstract class ActivityModule { @ContributesAndroidInjector abstract fun contributePaoActivity(): PaoActivity }
2 . 修改AppComponent.kt
@Singleton @Component(modules = arrayOf( AndroidInjectionModule::class, AppModule::class, ActivityModule::class) ) interface AppComponent { @Component.Builder interface Builder { @BindsInstance fun application(application: Application): Builder fun build(): AppComponent } fun inject(application: PaoApp) }
相比Dagger2,modules多了AndroidInjectionModule和ActivityModule两个类。
3 . rebuild一下项目,然后新增PaoApp.kt同时实现HasActivityInjector接口
class PaoApp : Application(),HasActivityInjector{ @Inject lateinit var dispatchingAndroidInjector: DispatchingAndroidInjector<Activity> override fun onCreate() { super.onCreate() DaggerAppComponent.builder().application(app).build().inject(app) } override fun activityInjector() = dispatchingAndroidInjector }
4 . 最后在Activity的onCreate()方法之前调用
AndroidInjection.inject(this)
进行注入
class PaoActivity : RxAppCompatActivity() { @Inject lateinit var mViewModel : PaoViewModel override fun onCreate(savedInstanceState: Bundle?) { //////di AndroidInjection.inject(this) super.onCreate(savedInstanceState) } }
到此,一个简单的依赖注入就好了。
当然简单是绝不简单的。这些是在写什么?完全云里雾里。刚从Dagger转换成Dagger-Android的直接就劝退了,还不如直接使用Dagger2的好。
确实,对于日常功能迭代的开发团队来说,普通的dagger更易理解,所以Dagger-Android也算是一个可选项,可以作为一个提高,而且google的很多示例里dagger的用法都是Dagger-Android,所以还是有必要懂它的原理。
原理剖析
在第四部分中,我们也了解了普通的Dagger是如何进行依赖注入的,这里我们再来回顾一次
由AppModule提供所需的依赖 由AppCompent提供注入的途径 由@Inject标识需要注入的对象 调用 DaggerAppComponent.builder() .appModule(AppModule(applicationContext)).build() .inject(this) 完成依赖注入
这里的逻辑比较好理解一些,就是普通的
paoActivity.mViewModel = appComponent.paoViewModel
那Dagger-Android相比之下,又是怎么样的逻辑呢?
相比之前,Dagger-Android将Activity/Fragment所需的compoent都放到了一个map对象里,这个map对象由App的 dispatchingAndroidInjector
对象持有。其中 key
值为activity/fragment的class, value
为提供相应Component的Provider对象。
Map<Class<? extends T>, Provider<AndroidInjector.Factory<? extends T>>>
当我们在Activity中调用 AndroidInjection.inject(this)
时,又在做什么呢?
```java
public static void inject(Activity activity) {
checkNotNull(activity, "activity");
Application application = activity.getApplication();
if (!(application instanceof HasActivityInjector)) {
throw new RuntimeException(
以上所述就是小编给大家介绍的《使用 Kotlin 构建 MVVM 应用程序—提高篇:Dagger-Android》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 构建一个混合的费用跟踪应用程序
- 构建安全计划 提升应用程序安全能力
- 第三章-构建Markdown应用程序
- 构建大型 React 应用程序的最佳实践
- 构建大型 React 应用程序的最佳实践
- 构建Kubernetes有状态应用程序的不同方法
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。