【发布时间】:2021-03-17 11:49:38
【问题描述】:
我有一个组件:具有@CarScope 作用域的 CarComponent 和具有@DriverScope 作用域的子组件 DriverSubcomponent。基本上汽车需要司机,司机需要头盔。
这是汽车组件:
@CarScope
@Component
interface CarComponent {
val driverComponentBuilder: DriverComponent.Builder
fun getCar(): Car
@Component.Builder
interface Builder{
fun build(): CarComponent
@BindsInstance
fun carName(@Named("CNAME") name: String): Builder
@BindsInstance
fun driverName(@Named("DNAME") driverName: String): Builder
}
}
还有一个驱动子组件:
@DriverScope
@Subcomponent(modules=[HelmetModule::class])
interface DriverComponent {
fun getDriver(): Driver
@Subcomponent.Builder
interface Builder {
fun build(): DriverComponent
}
}
头盔模块:
@Module
interface HelmetModule {
@Binds
fun bindHelmet(whiteHelmet: WhiteHelmet): Helmet
}
以及对应的类:
@CarScope
class Car @Inject constructor(@Named("CNAME") private val name: String, private val driver: Driver) {
override fun toString(): String {
return "Car: $name, Driver: $driver, hash: ${super.toString()}"
}
}
class Driver @Inject constructor (@Named("DNAME") private val driverName: String, private val helmet: Helmet){
override fun toString(): String{
println("Driver Name: $driverName")
println("Helmet info: $helmet")
println (super.toString())
return super.toString()
}
}
interface Helmet {
fun putOn(): Boolean
fun takeOff(): Boolean
}
class WhiteHelmet @Inject constructor() : Helmet {
override fun putOn(): Boolean {
println("White Helmet is on")
return true
}
override fun takeOff(): Boolean {
println("White Helmet is off")
return false
}
override fun toString(): String {
return "White Helmet"
}
}
我注意到除非我将 (modules = [HelmetModule::class]) 添加到 CarComponent,否则这段代码将无法编译。看来我调用getCar()的时候,并没有使用DriverComponent提供的Driver,而是创建了所有需要的对象,
我的目标是使用 DriverComponent 提供的 Driver。
有什么方法可以做到这一点? 当前行为是否与我使用的自定义范围有关?
谢谢。 莱泽克
【问题讨论】: