当您要提供作用域相关性时,Dagger也需要为此Component
注释Scope
。是什么原因呢?
@Singleton // <- for what?
@Component(modules = [MyModule::class])
interface MyComponent {
//...
}
@Module
interface MyModule {
@Binds
@Singleton
fun provideDependency(impl: DepImpl): Dep
}
答案 0 :(得分:1)
在Dagger中进行作用域范围的意思是“使绑定与包含它的组件具有相同的生存期”,因此组件本身保留在实例上,因此可以重复提供相同的实例。
组件也是分层的:通过子组件和组件依赖性,您可以在同一应用程序中同时存在多个组件。在典型的Android应用中,您可能具有一个Application组件,该组件为多个Activity组件提供绑定,并且每个Activity组件为多个Fragment组件提供绑定。
尽管Dagger从理论上可以根据安装哪个模块来推断作用域,而不是要求您指定哪个作用域应用于哪个组件,但这使使用声明作用域和@Inject
注释的类在没有显式Dagger绑定。如果您处于从应用程序组件(通常为“单个”)继承绑定的Activity组件中,并且Activity绑定依赖于带有@ApplicationScope
构造函数的带有@Inject
注释的类,Dagger怎么知道放在应用程序组件而不是活动组件中?这也可能会使您的代码更难让人理解-我知道我很难遵循它。