Коин как впрыскивать вне активности Android / appcompatactivity
Koin - это новая легкая библиотека для DI, которую можно использовать как в Android, так и в автономных приложениях kotlin.
Обычно вы вводите зависимости следующим образом:
class SplashScreenActivity : Activity() {
val sampleClass : SampleClass by inject()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
}
}
с inject()
метод.
Но как насчет инъекций в тех местах, где контекст действия недоступен, то есть вне действия?
1 ответ
Здесь KoinComponent
который приходит на помощь. В любом классе вы можете просто:
class SampleClass : KoinComponent {
val a : A? by inject()
val b : B? by inject()
}
простирающийся KoinComponent
дает вам доступ к inject()
метод.
Помните, что обычно достаточно ввести материал обычным способом:
class SampleClass(val a : A?, val b: B?)
Коин предлагает решение для этого, используя KoinComponent
интерфейс. Например, если вам нужно получить некоторые зависимости в вашем хранилище, вы можете просто реализовать интерфейс KoinComponent. Это дает вам доступ к различным функциям Koin, таким как get()
а также inject()
, Используйте KoinComponent только тогда, когда вы не можете переписать конструктор, чтобы принять зависимости в качестве параметров конструктора.
class MyRepository: Repository(), KoinComponent {
private val myService by inject<MyService>()
}
Конструктор инъекций лучше, чем этот подход.
Например, то же самое может быть достигнуто путем:
class MyRepository(private val service: MyService): Repository() {
...
}
И вы можете добавить определение для создания экземпляра этого класса в модуле koin:
val serviceModule = module {
...
factory { MyService() }
}
val repositoryModule = module {
...
factory { MyRepository(get<MyService>()) }
}
Если вы не хотите реализовывать какие-либо интерфейсы, просто посмотрите, как KoinComponent.inject()
реализовано и сделайте что-то подобное самостоятельно
val sampleClass by lazy { GlobalContext.get().koin.get<SampleClass>() }