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

В https://github.com/InsertKoinIO/koin/blob/master/koin-projects/docs/reference/koin-android/scope.md#sharing экземпляры между компонентами с областями действия показан пример ниже

module {
    // Shared user session data
    scope(named("session")) {
        scoped { UserSession() }
    }

    // Inject UserSession instance from "session" Scope
    factory { (scopeId : ScopeID) -> Presenter(getScope(scopeId).get())}
}

Но я даже не знаю, как получить presenter?

Я пытаюсь

val nameScope = getKoin().createScope("SomeName", named("session"))
val presenter = get<Presenter>(nameScope.id)

, но это не правильно. Как получить мой presenter?

1 Ответ

0 голосов
/ 22 апреля 2020

После трассировки кода, способ сделать это - использовать parameter для передачи scopeId

. Для приведенного выше примера это будет

val nameScope = getKoin().createScope("SomeName", named("session"))
val presenter = get<Presenter>(parameters = { parametersOf(nameScope.id) )

Если есть квалификатор нам просто нужно отправить через них

Один пример, как показано ниже, где нам нужен параметр лямбда-выражения для отправки через scopeId и name спецификатора. (аргумент самоопределяем через параметры любого типа).

    module {
        scope(named("AScopeName")) {
            scoped(qualifier = named("scopedName")) { Dependency() }
            factory(qualifier = named("factoryName")) { Dependency() }
        }


        factory { (scopeId: ScopeID, name: String) ->
            Environment(getScope(scopeId).get(qualifier = named(name)))
        }
    }

Тогда вызов так же прост, как показано ниже

val nameScope = getKoin().createScope("SomeName", named("AScopeName"))
val environment = get<Environment>(parameters = { parametersOf(nameScope.id, "scopedName") })

Или мы также можем

val nameScope = getKoin().createScope("SomeName", named("AScopeName"))
val environment = get<Environment>(parameters = { parametersOf("SomeName", "scopedName") })
...