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

时间:2018-06-13 14:57:05

标签: kotlin koin

我有像

这样的顶级功能
fun sendNotification(context:Context, data:Data) {
    ...//a lot of code here
}

该功能创建通知,有时通知可以包含图像,所以我必须下载它。我使用Glide,它被包裹在接口ImageManager上,所以我必须注入它。我使用Koin作为DI,问题是我不能写

val imageManager: ImageManager by inject()

在我的代码中的某处,因为没有实现KoinComponent接口的东西。

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

2 个答案:

答案 0 :(得分:9)

最简单的方法是创建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>()

答案 1 :(得分:0)

我是以这种方式完成的

fun Route.general() {

val repo: OperationRepo by lazy { GlobalContext.get().koin.get() }
...
}