首页 > 解决方案 > 为什么 Dagger 组件需要 @Scope 注解

问题描述

当你想提供作用域依赖时,Dagger 也需要Component使用 this进行注释Scope。这是什么原因?

@Singleton // <- for what?
@Component(modules = [MyModule::class])
interface MyComponent {
  //...
}

@Module
interface MyModule {

    @Binds
    @Singleton
    fun provideDependency(impl: DepImpl): Dep
}

标签: dagger-2

解决方案


Dagger 中的作用域意味着“赋予此绑定与包含它的组件相同的生命周期”,因此组件本身会保留实例,因此它可以重复提供相同的实例。

组件也是分层的:通过子组件和组件依赖关系,您可以让多个组件共存于同一个应用程序中。在一个典型的 Android 应用程序中,您可能有一个 Application 组件为多个 Activity 组件提供绑定,并且每个 Activity 组件都为多个 Fragment 组件提供绑定。

尽管 Dagger 理论上可以根据安装它的模块来推断作用域,而不是要求您指定哪个作用域适用于哪个组件,但这使得在@Inject没有显式 Dagger 绑定的情况下使用声明作用域和注释的类变得更加困难。如果您在一个 Activity 组件中,该组件从 Application 组件(通常是“单例”)继承绑定,并且 Activity 绑定依赖于@ApplicationScope带有构造函数的 -annotated 类@Inject,那么 Dagger 怎么知道将它放在 Application 组件中而不是活动组件?这也可能使你的代码更难被人类理解——我知道我很难理解它。


推荐阅读