Android 如何使用Dagger将@Inject注入Kotlin Builder类
我当前的Android项目使用了许多Kotlin数据类,这些数据类雇用了构建者来构建它们 我希望向Kotlin数据类中注入一个实例 我的每个数据类都有这个基本结构Android 如何使用Dagger将@Inject注入Kotlin Builder类,android,kotlin,dagger-2,Android,Kotlin,Dagger 2,我当前的Android项目使用了许多Kotlin数据类,这些数据类雇用了构建者来构建它们 我希望向Kotlin数据类中注入一个实例 我的每个数据类都有这个基本结构 data class MyDataKlass( val onError: Consumer<in Throwable>, val onComplete: Action, val dbController: Da
data class MyDataKlass( val onError: Consumer<in Throwable>,
val onComplete: Action,
val dbController: DatabaseController,
val lnController: ILoginNetworkController) : BaseSO() {
@SuppressLint("CheckResult")
fun execute() {
}
}
fun myFunction(block: MyDataKlassBuilder.() -> Unit): MyDataKlass = MyDataKlassBuilder().apply(block).build()
class MyDataKlassBuilder {
var onError: Consumer<in Throwable> = Consumer { }
var onComplete: Action = Action { }
lateinit var dbController: DatabaseController
lateinit var lnController: ILoginNetworkController
fun build(): MyDataKlass = MyDataKlass(onError, onComplete, dbController, lnController)
}
目前,我正在将我的数据库(DatabaseController
)和网络(ILoginNetworkController
)控制器传递到Kotlin数据类的构建器中
我希望@注入它们,使我的代码“更干净”
我可以@注入到我的活动和存储库中,但看不到如何使用Dagger将它们注入到上述数据类中
有可能@Inject到Kotlin数据类中吗?我从未在数据类上尝试过这种语法,但它可能是一种很好的语法:
data class MyDataKlass @Inject constructor(
val onError: Consumer<in Throwable>,
val onComplete: Action,
val dbController: DatabaseController,
val lnController: ILoginNetworkController
) : BaseSO() {
@SuppressLint("CheckResult")
fun execute() {
}
}
当然,您的依赖关系图必须指定如何提供数据类的所有参数。我看不出如何@提供我的数据Klass并仍然使用不同的值来构建它们。匕首允许这样做吗?例如,每次使用我的数据类时,我都必须向它们传递一个唯一的密钥。这取决于应用程序的体系结构。例如,如果每个屏幕都有一个作用域子组件,则可以在相关模块/子模块中提供该键。否则,您可以使用
@Named
注释找到注入给定密钥的方法。使用相同的数据类结构但具有特定属性的另一种方法是扩展MyDataKlass
,使其具有Dagger可以区分的特定具体类型。我认为这里的谎言是,这不应该是一个数据类,因为它不是data
,它可以执行execute()
潜在的异步操作
data class MyDataKlass @Inject constructor(
val onError: Consumer<in Throwable>,
val onComplete: Action,
val dbController: DatabaseController,
val lnController: ILoginNetworkController
) : BaseSO() {
@SuppressLint("CheckResult")
fun execute() {
}
}
lateinit var dataKlass: MyDataKlass @Inject set