如何在顶级函数中使用 koin 注入依赖项
How to inject dependency using koin in top level function
我有像
这样的顶级函数
fun sendNotification(context:Context, data:Data) {
...//a lot of code here
}
那个函数创建通知,有时通知可以包含图像,所以我必须下载它。我正在使用包裹在 ImageManager 接口上的 Glide,所以我必须注入它。我用 Koin 做 DI,问题是我不能写
val imageManager: ImageManager by inject()
在我的代码中的某处,因为没有实现 KoinComponent 接口的东西。
最明显的解决方案是将已经在其他地方注入的 imageManager
作为函数的参数传递,但我不想这样做,因为在大多数情况下我不需要 imageManager
:这取决于类型Data
个参数。
最简单的方法是创建 KoinComponent
对象作为包装器,然后从中获取变量:
val imageManager = object:KoinComponent {val im: ImageManager by inject()}.im
顺便说一句,最好用一些函数来包装它,例如我使用
inline fun <reified T> getKoinInstance(): T {
return object : KoinComponent {
val value: T by inject()
}.value
}
所以如果我需要实例我就写
val imageManager:ImageManager = getKoinInstance()
或
val imageManager = getKoinInstance<ImageManager>()
我是这样做的
fun Route.general() {
val repo: OperationRepo by lazy { GlobalContext.get().koin.get() }
...
}
我有像
这样的顶级函数fun sendNotification(context:Context, data:Data) {
...//a lot of code here
}
那个函数创建通知,有时通知可以包含图像,所以我必须下载它。我正在使用包裹在 ImageManager 接口上的 Glide,所以我必须注入它。我用 Koin 做 DI,问题是我不能写
val imageManager: ImageManager by inject()
在我的代码中的某处,因为没有实现 KoinComponent 接口的东西。
最明显的解决方案是将已经在其他地方注入的 imageManager
作为函数的参数传递,但我不想这样做,因为在大多数情况下我不需要 imageManager
:这取决于类型Data
个参数。
最简单的方法是创建 KoinComponent
对象作为包装器,然后从中获取变量:
val imageManager = object:KoinComponent {val im: ImageManager by inject()}.im
顺便说一句,最好用一些函数来包装它,例如我使用
inline fun <reified T> getKoinInstance(): T {
return object : KoinComponent {
val value: T by inject()
}.value
}
所以如果我需要实例我就写
val imageManager:ImageManager = getKoinInstance()
或
val imageManager = getKoinInstance<ImageManager>()
我是这样做的
fun Route.general() {
val repo: OperationRepo by lazy { GlobalContext.get().koin.get() }
...
}