dagger-2 - 为什么 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 中的作用域意味着“赋予此绑定与包含它的组件相同的生命周期”,因此组件本身会保留实例,因此它可以重复提供相同的实例。
组件也是分层的:通过子组件和组件依赖关系,您可以让多个组件共存于同一个应用程序中。在一个典型的 Android 应用程序中,您可能有一个 Application 组件为多个 Activity 组件提供绑定,并且每个 Activity 组件都为多个 Fragment 组件提供绑定。
尽管 Dagger 理论上可以根据安装它的模块来推断作用域,而不是要求您指定哪个作用域适用于哪个组件,但这使得在@Inject
没有显式 Dagger 绑定的情况下使用声明作用域和注释的类变得更加困难。如果您在一个 Activity 组件中,该组件从 Application 组件(通常是“单例”)继承绑定,并且 Activity 绑定依赖于@ApplicationScope
带有构造函数的 -annotated 类@Inject
,那么 Dagger 怎么知道将它放在 Application 组件中而不是活动组件?这也可能使你的代码更难被人类理解——我知道我很难理解它。
推荐阅读
- ignite - 将包含字符串和数字格式的 CSV 数据加载到 Ignite 失败
- javascript - GTM 变量中的 Javascript IF/Else
- netsuite - 来自客户端脚本的库存详细信息子记录
- node.js - libusb node usb 获取设备实例路径
- android - 如何设置高度等于其宽度?
- .net-core - 在 Swagger 上指定可能的错误代码 - DotNet Web API
- javascript - ShellJS 启动脚本但不停止当前流程
- php - 如何将使用模板处理器制作的 Word (docx) 文件附加到要发送的电子邮件中
- swift - 如何使用 Swift 包管理器更新 iOS 模拟器部署目标?
- java - 比较两个填充了不同类型对象的集合