Kotlin 创建继承koin组件的函数
我试图简化:Kotlin 创建继承koin组件的函数,kotlin,koin,Kotlin,Koin,我试图简化: // Tag class with KoinComponent class HelloApp : KoinComponent { // lazy inject dependency val helloService: HelloServiceImpl by inject() fun sayHello(){ helloService.sayHello() } } 差不多 fun sayHello() = koinComponent
// Tag class with KoinComponent
class HelloApp : KoinComponent {
// lazy inject dependency
val helloService: HelloServiceImpl by inject()
fun sayHello(){
helloService.sayHello()
}
}
差不多
fun sayHello() = koinComponent {
val helloService: HelloServiceImpl by inject()
helloService.sayHello()
}
这样可能吗,或者我注定要用invoke操作符创建一个类?好吧,这是可行的:
首先,让我们定义服务和实现:
interface HelloService {
fun sayHello()
}
class HelloServiceImpl(private val name: String) : HelloService {
override fun sayHello() {
println("Hello, $name!")
}
}
很明显,服务将向在其构造函数中配置的人问好
现在,Kouncomponent函数:
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()
}
输出:你好,majkrzak
这一切都很简单:为了能够使用,您需要在上下文中使用Koin。实际上,KoinComponent的工作方式是使用GlobalContext:
现在我有一个问题要问你:你为什么需要它?主要是用Kotlin做实验。目前,我已经以如下形式实现了SimpleService:class Query:KoinComponent{private val client:HttpClient by Injection suspend operator fun invokequery:String=client.Posterl{body=Query}}并想知道是否可以将其简化一点。我刚刚意识到这是一种解决方法,有合法的方法吗?这个代码怎么了?它的工作原理与kocomponent完全相同。
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)
fun <T> koinComponent(koin: Koin = GlobalContext.get().koin, block: Koin.() -> T) {
koin.block()
}