0

我有两种接口类型,每种都有两个子类。我创建了一个 Koin 模块,其中 Interface1 的每个子类都有一个范围,并且在每个范围内,范围版本Interface2Interface2. 在 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)
4

0 回答 0