Как внедрить зависимость с помощью коина в функции верхнего уровня

У меня есть функция верхнего уровня, например

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

Эта функция создает уведомления, иногда уведомление может содержать изображение, поэтому мне нужно его загрузить. Я использую Glide, который обернут поверх интерфейса ImageManager, поэтому мне нужно ввести его. Я использую Koin для DI, и проблема в том, что я не могу писать

val imageManager: ImageManager by inject()

где-то в моем коде, потому что нет чего-то, что реализует интерфейс KoinComponent.

Наиболее очевидное решение - передать уже введенный где-то еще imageManager в качестве параметра функции, но я не хочу этого делать, потому что в большинстве случаев мне не нужен imageManager: это зависит от типа параметра Data.


person Andrey Danilov    schedule 13.06.2018    source источник


Ответы (2)


Самый простой способ - создать объект 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()

or

val imageManager = getKoinInstance<ImageManager>()
person Andrey Danilov    schedule 13.06.2018
comment
решение в первом фрагменте сработало, а встроенная функция - нет (для меня). Пришлось поменять <reified T : Any> - person Henning; 05.04.2019

Я сделал это таким образом

fun Route.general() {

val repo: OperationRepo by lazy { GlobalContext.get().koin.get() }
...
}
person w201    schedule 12.11.2020