kotlin - 创建继承koin组件的函数
问题描述
我试图简化:
// 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!")
}
}
很明显,服务会向在其构造函数中配置的人说“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
委托,您需要一个 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()
}
现在我有一个问题要问你:你为什么需要它?
推荐阅读
- python - scipy 稀疏矩阵上的 sklearn train_test_split 给出错误的结果
- vue.js - 将 vue 1 迁移到 vue 2
- wpf - Oxyplot- WPF:将数据从双重列表添加到数据点
- python - Django Stripe Connect 帐户创建
- python - 初学者打开资源管理器以显示文件夹内容
- node.js - 尝试实现节点 js 多图时出现问题
- python - PyQt4 如何让 QWidget 始终位于顶部?
- java - 将“2个背景”设置为一个按钮
- io - Flutter:权限被拒绝写入文件
- javascript - jQuery在使用ajax创建表后从表中获取nth:child