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()
}