创建函数继承koin组件
Create function inheriting koin component
我正在尝试简化:
// 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
运算符制作 class?
嗯,这是可行的:
首先,让我们定义服务和实现:
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
函数,以便使用 Koin
接收器调用它的 block
参数并隐式使用该全局 koin 实例。
我们可以通过使用默认值使其更易于重用:
fun <T> koinComponent(koin: Koin = GlobalContext.get().koin, block: Koin.() -> T) {
koin.block()
}
现在我有一个问题要问你:你为什么需要它?
我正在尝试简化:
// 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
运算符制作 class?
嗯,这是可行的:
首先,让我们定义服务和实现:
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
函数,以便使用 Koin
接收器调用它的 block
参数并隐式使用该全局 koin 实例。
我们可以通过使用默认值使其更易于重用:
fun <T> koinComponent(koin: Koin = GlobalContext.get().koin, block: Koin.() -> T) {
koin.block()
}
现在我有一个问题要问你:你为什么需要它?