11

我有顶级功能

fun sendNotification(context:Context, data:Data) {
    ...//a lot of code here
}

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

val imageManager: ImageManager by inject()

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

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

4

2 回答 2

27

最简单的方法是将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>()
于 2018-06-13T14:57:04.513 回答
1

我是这样做的

fun Route.general() {

val repo: OperationRepo by lazy { GlobalContext.get().koin.get() }
...
}
于 2020-11-12T09:33:18.063 回答