例如,我有以下课程:
abstract class BaseClass()
class SpecificClass : BaseClass()
现在,我想通过SpecificClass
依赖项注入来提供koin
,但我也想在同一图中提供基类BaseClass
。
为清楚起见,我想做类似的事情:
class Someclass {
...
private specificClass: SpecificClass by inject()
...
}
class Someclass {
...
private baseClass: BaseClass by inject()
// where this BaseClass is just the the same instace of the SpecificClass in the dependency graph
...
}
我该如何执行此模块?如何将实现实例注入baseClass引用?
答案 0 :(得分:2)
您可以通过2种方式使用Koin进行操作
方法1
您可以像这样为它们创建依赖关系
single {
SpecificClass()
}
single<BaseClass> {
get<SpecificClass>()
}
通过这种方式,每当您注入实例时,它都会相应地注入
方法2
您可以使用这样的命名依赖项
single("BaseClassImpl") {
SpecificClass()
}
当您想要注入它时,请为该依赖项提供密钥,如下所示:
class Someclass {
...
private specificClass: SpecificClass by inject("BaseClassImpl")
...
}
class Someclass {
...
private baseClass: BaseClass by inject("BaseClassImpl")
// where this BaseClass is just the the same instace of the SpecificClass in the dependency graph
...
}
答案 1 :(得分:0)
您不能注入抽象类。
要注入一个类,它必须是可实例化的,而抽象类则不能。
要向Koin注入SpecificClass
,您需要创建一个模块:
val appModule = module {
single {
SpecificClass()
}
}
在您的应用程序类中将其初始化:
class MyApplication : Application() {
override fun onCreate(){
super.onCreate()
// start Koin!
startKoin {
// declare used Android context
androidContext(this@MyApplication)
// declare modules
modules(appModule)
}
}
}
并在您的活动/片段中使用注入委派
class MyActivity() : AppCompatActivity() {
val specificClass : SpecificClass by inject()
}