如何在顶级函数中使用koin注入依赖项

And*_*lov 6 kotlin koin

我有顶级功能

fun sendNotification(context:Context, data:Data) {
    ...//a lot of code here
}
Run Code Online (Sandbox Code Playgroud)

该函数创建通知,有时通知可以包含图像,所以我必须下载它.我使用Glide,它被包裹在接口ImageManager上,所以我必须注入它.我使用Koin进行DI,问题是我无法写

val imageManager: ImageManager by inject()
Run Code Online (Sandbox Code Playgroud)

在我的代码中的某个地方,因为没有实现KoinComponent接口的东西.

最明显的解决方案是将已经注入其他地方imageManager作为函数参数传递,但我不想这样做,因为在大多数情况下我不需要imageManager:它取决于Data参数的类型.

And*_*lov 12

最简单的方法是将KoinComponent对象创建为包装器,然后从中获取变量:

val imageManager = object:KoinComponent {val im: ImageManager by inject()}.im
Run Code Online (Sandbox Code Playgroud)

顺便说一句,通过某些功能来包装它,例如我使用

inline fun <reified T> getKoinInstance(): T {
    return object : KoinComponent {
        val value: T by inject()
    }.value
}
Run Code Online (Sandbox Code Playgroud)

所以如果我需要实例,我就写

val imageManager:ImageManager = getKoinInstance()
Run Code Online (Sandbox Code Playgroud)

要么

val imageManager = getKoinInstance<ImageManager>()
Run Code Online (Sandbox Code Playgroud)