嗯,这是可行的:
首先,让我们定义服务和实现:
interface HelloService {
fun sayHello()
}
class HelloServiceImpl(private val name: String) : HelloService {
override fun sayHello() {
println("Hello, $name!")
}
}
很明显,服务会向在其构造函数中配置的人说“Hello”。
现在,koinComponent 函数:
fun <T> koinComponent(block: Koin.() -> T) {
GlobalContext.get().koin.block()
}
你的功能:
fun sayHello() = koinComponent {
val helloService: HelloServiceImpl by inject()
helloService.sayHello()
}
及用法:
fun main() {
startKoin {
modules(listOf(
module {
single { HelloServiceImpl("majkrzak") }
}
))
}
sayHello()
}
输出:Hello, majkrzak!
这一切都非常简单:为了能够使用inject delegate,您需要一个 Koin 上下文。实际上,KoinComponent 的工作方式是使用GlobalContext:
interface KoinComponent {
fun getKoin(): Koin = GlobalContext.get().koin
}
inline fun <reified T> KoinComponent.inject(
qualifier: Qualifier? = null,
noinline parameters: ParametersDefinition? = null
): Lazy<T> =
getKoin().inject(qualifier, parameters)
那么,为什么不这样做呢?我们声明了koinComponent 函数,以便它的block 参数被Koin 接收器调用并隐式使用该全局koin 实例。
我们可以通过使用默认值使其更具可重用性:
fun <T> koinComponent(koin: Koin = GlobalContext.get().koin, block: Koin.() -> T) {
koin.block()
}
现在我有一个问题要问你:你为什么需要它?