我有两种接口类型,每种都有两个子类。我创建了一个 Koin 模块,其中 Interface1 的每个子类都有一个范围,并且在每个范围内,范围版本Interface2
是Interface2
. 在 Koin 组件中,我试图使用 Interface1 类型的范围来获取 Interface2 的正确子类。
以前,在 Koin 的 2.1.6 版本中,Any
类型上有一个名为scope
. 这将从对象中获取范围,并且我能够使用以下行来完成此任务,假设“interface1”是一些实现Interface1
interface1.scope.get<Interface2>()
这在 Koin 的更高版本中被删除了,现在从 3.1.2 版开始,我不知道如何实现这一点了。
以下代码是我为尝试执行此操作而设置的,随后出现错误。
如果有人知道如何使它工作,将不胜感激。
fun main() {
startKoin { modules(applicationModule) }
ScopeTestClass().start(Interface1Subclass1())
}
class ScopeTestClass : KoinComponent {
fun start(test: Interface1) {
val test2 = get<Interface2>(test.getScopeName())
println(test2)
}
}
interface Interface1
class Interface1Subclass1(val data: String = "hello") : Interface1
class Interface1Subclass2(val data: String = "hi") : Interface1
interface Interface2 {
fun print()
}
class Interface2Subclass1(val payload: String = "fdsafd") : Interface2 {
override fun print() { println(payload) }
}
class Interface2Subclass2(val number: Int = 7) : Interface2 {
override fun print() { println(number) }
}
val applicationModule = module {
scope<Interface1Subclass1> {
scoped<Interface2> {
Interface2Subclass1("hello")
}
}
scope<Interface1Subclass2> {
scoped<Interface2> { Interface2Subclass2(9) }
}
}
Exception in thread "main" org.koin.core.error.NoBeanDefFoundException: No definition found for class:'Interface2' & qualifier:'q:'Interface1Subclass1''. Check your definitions!
at org.koin.core.scope.Scope.throwDefinitionNotFound(Scope.kt:273)
at org.koin.core.scope.Scope.resolveValue(Scope.kt:243)
at org.koin.core.scope.Scope.resolveInstance(Scope.kt:211)
at org.koin.core.scope.Scope.get(Scope.kt:193)
at ScopeTestClass.start(ScopeTest.kt:50)
at ScopeTestKt.main(ScopeTest.kt:9)
at ScopeTestKt.main(ScopeTest.kt)