如何在顶级函数中使用 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() }
...
}