Как создать экземпляры с зависимостями времени выполнения с помощью Koin?

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


person homerman    schedule 06.11.2018    source источник


Ответы (1)


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

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

 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

person Sandip Savaliya    schedule 27.02.2019
comment
Не могли бы вы отметить это как принятый ответ, если вам это подходит? - person Sandip Savaliya; 21.06.2019