Я экспериментирую с Koin при создании HTTP-сервера на основе Kotlin.
Я использую фреймворк, в котором вы кодируете желаемое поведение, расширяя некоторые предоставляемые фреймворком абстрактные классы, и заполняете логику реализации в различных точках жизненного цикла компонента (аналогично Android). В какой-то момент в жизненном цикле компонента ресурс, специфичный для фреймворка (отображается как поле), инициализируется и становится доступным для использования.
Моя проблема в том, что мне нужно это поле для создания экземпляров, возвращаемых из моего модуля Koin.
Я хотел бы сделать что-то вроде этого:
interface MyInteractor
class MyComponent : FrameworkComponent(), KoinComponent {
// "helper" is a field local to this class and used as
// an injection parameter
private val myInteractor: MyInteractor by inject { parametersOf(helper) }
private val myModule = module {
single<MyInteractor> { (helper: FrameworkField) ->
// return an instance of MyInteractor using "helper"
}
}
// lifecycle method
override fun start() {
startKoin(listOf(myModule))
}
}
Вышеуказанное не работает, хотя «помощник» не инициализируется до более позднего времени в жизненном цикле компонента.
Мне удалось обойти эту проблему, спрятав «помощника» в контексте Koin, а затем извлекая его из контекста при создании различных экземпляров, но это кажется неуклюжим и повторяющимся. Я надеюсь, что есть более чистый способ сделать это.