Коин как впрыскивать вне активности 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>() }
Другие вопросы по тегам