为什么Dagger组件需要@Scope批注

时间:2018-07-18 17:56:07

标签: dagger-2

当您要提供作用域相关性时,Dagger也需要为此Component注释Scope。是什么原因呢?

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

@Module
interface MyModule {

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

1 个答案:

答案 0 :(得分:1)

在Dagger中进行作用域范围的意思是“使绑定与包含它的组件具有相同的生存期”,因此组件本身保留在实例上,因此可以重复提供相同的实例。

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

尽管Dagger从理论上可以根据安装哪个模块来推断作用域,而不是要求您指定哪个作用域应用于哪个组件,但这使使用声明作用域和@Inject注释的类在没有显式Dagger绑定。如果您处于从应用程序组件(通常为“单个”)继承绑定的Activity组件中,并且Activity绑定依赖于带有@ApplicationScope构造函数的带有@Inject注释的类,Dagger怎么知道放在应用程序组件而不是活动组件中?这也可能会使您的代码更难让人理解-我知道我很难遵循它。