5

我在我的项目中使用Koin di 库。lib 的版本是1.0.0-RC-1

我的模块

val appModule = module {
    scope("UserScope") { UserToaster(androidContext()) as Toaster }
    scope("AnonScope") { AnonToaster(androidContext()) as Toaster }
}

我在我的Application类中开始 koin 并创建了范围

override fun onCreate() {
    super.onCreate()

    startKoin(this, listOf(appModule))
    getKoin().getOrCreateScope("AnonScope")
}

接下来我尝试将Toaster的实现从当前范围注入 Activity 中的变量。这里的代码:

private val toaster: Toaster by inject(scope = "AnonScope")

在此之后我得到一个错误:

Caused by: org.koin.error.DependencyResolutionException: Multiple definitions found for type 'interface com.example.nkirilov.playground.Toaster (Kotlin reflection is not available)' - Koin can't choose between :
    Scope [name='UserScope',class='com.example.nkirilov.playground.Toaster']
    Scope [name='AnonScope',class='com.example.nkirilov.playground.Toaster']
    Check your modules definition, use inner modules visibility or definition names.

我不明白为什么这不起作用(如果使用具有不同名称的单个- 它会起作用)。那是koin错误吗?如何避免这个错误?

4

2 回答 2

2

我是这样实现的

模块

val navigationModule = module {
    scope(DI.APP_SCOPE) { ClassA().create }
    scope(DI.APP_SCOPE) { get(scopeId = DI.APP_SCOPE).classB }
    scope(DI.APP_SCOPE) { get(scopeId = DI.APP_SCOPE).classC }
}

val authModule = module {
    scope(DI.AUTH_SCOPE) { ClassA.create(ChildClassB(get(scopeId = DI.APP_SCOPE))) }
    scope(DI.AUTH_SCOPE) { get(scopeId = DI.AUTH_SCOPE).classB }
    scope(DI.AUTH_SCOPE) { get(scopeId = DI.AUTH_SCOPE).classC }
}

主要活动

private val classC: ClassC by inject(scope = getKoin().getOrCreateScope(APP_SCOPE))

授权活动

private val classC: ClassC by inject(scope = getKoin().getOrCreateScope(DI.AUTH_SCOPE))
于 2018-10-11T06:30:48.413 回答
0

您的定义在 Koin 中具有相同的名称。当前版本(~1.0.*)通过自动解析类型及其会话 ID 来避免您指定要使用的范围。

您能否避免使用相同类型来描述您的定义,例如:

val appModule = module {
    scope("UserScope") { UserToaster(androidContext()) }
    scope("AnonScope") { AnonToaster(androidContext()) }
}

否则,我们需要一个特性来指定解析类型时要使用的范围。您可以通过以下方式解决它:

val userScope = getScope("UserScope")
get<Toaster>(scope = userScope)
于 2018-09-07T15:08:01.727 回答