Как создать экземпляры с зависимостями времени выполнения, используя Koin? - PullRequest
0 голосов
/ 06 ноября 2018

Я экспериментирую с 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, а затем извлекая его из контекста при создании различных экземпляров, но это кажется неуклюжим и повторяющимся. Я надеюсь, что есть более чистый способ сделать это.

1 Ответ

0 голосов
/ 27 февраля 2019

Конечно, есть

в вашем модуле, определите ваш модуль, как показано ниже,

 single { (args: Array<Any>) -> SignInViewModel(args[0] as SignInCallback) }

и затем в своей деятельности передайте значение аргумента, как показано ниже,

val signInModel by inject<SignInViewModel>(parameters = getDefinitionParams(this@SignInFragment))

и getDefinitionParams () вот так

 fun getDefinitionParams(vararg any: Any) : ParameterDefinition{
        return object : ParameterDefinition {
            override fun invoke() = parametersOf(any)
        }
    }

Надеюсь, это полезно, Счастливое кодирование: D

...