【问题标题】:How to inject dependency using koin in top level function如何在顶级函数中使用 koin 注入依赖项
【发布时间】:2018-06-13 14:57:04
【问题描述】:

我有像这样的顶级功能

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

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

val imageManager: ImageManager by inject()

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

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

【问题讨论】:

    标签: kotlin koin


    【解决方案1】:

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

    【讨论】:

    • 第一个 sn-p 中的解决方案有效,但内联函数不起作用(对我而言)。我不得不改变它&lt;reified T : Any&gt;
    【解决方案2】:

    我是这样做的

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-01-30
      • 2021-12-18
      • 1970-01-01
      • 2019-05-30
      • 2011-11-22
      • 2019-12-25
      • 1970-01-01
      相关资源
      最近更新 更多