我在项目中使用Koin di库。 lib的版本为 1.0.0-RC-1 。
我的模块:
val appModule = module {
scope("UserScope") { UserToaster(androidContext()) as Toaster }
scope("AnonScope") { AnonToaster(androidContext()) as Toaster }
}
我在 Application 类中开始学习,并创建了 scope :
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.
我不明白为什么这不起作用(如果使用具有不同名称的单个-它将起作用)。那是古恩虫吗?如何避免这个错误?
答案 0 :(得分:0)
您的定义在Koin中具有相同的名称。当前版本(〜1.0。*)通过自动解析类型及其会话ID来避免您指定要使用的范围。
可以避免使用相同类型来描述您的定义吗?
val appModule = module {
scope("UserScope") { UserToaster(androidContext()) }
scope("AnonScope") { AnonToaster(androidContext()) }
}
否则,我们将需要一个功能来指定解析类型时要使用的范围。您可以使用以下方法解决该问题:
val userScope = getScope("UserScope")
get<Toaster>(scope = userScope)
答案 1 :(得分:0)
我是这样实现的
模块:
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))
AuthActivity :
private val classC: ClassC by inject(scope = getKoin().getOrCreateScope(DI.AUTH_SCOPE))