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

0 ответов

Есть конечно

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

 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

Другие вопросы по тегам