首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Definition '[Single:'com.example.handlers.SocketHandler']‘尝试覆盖现有的definition koin android

Definition '[Single:'com.example.handlers.SocketHandler']‘尝试覆盖现有的definition koin android
EN

Stack Overflow用户
提问于 2020-11-12 18:46:10
回答 1查看 48关注 0票数 0

我有一个SocketHandler接口和另外两个实现此接口的类。我想在几个处理程序中实现这个接口,并通过koin注入它们。

代码语言:javascript
复制
interface SocketHandler {

    fun onReceive(socketResponses: Enums.SocketResponses, callback: (item: String) -> Unit)

}


class ClassAHandlerImpl : SocketHandler, KoinComponent {

    override fun onReceive(
       socketResponses: Enums.SocketResponses, callback: (item: String) -> Unit
    ) {
        ....
    }

}


class ClassBHandlerImpl: SocketHandler, KoinComponent {

    override fun onReceive(
        socketResponses: Enums.SocketResponses, callback: (item: String) -> Unit
    ) {
        ....
   }
}

以及这些类的Koin模块实现

代码语言:javascript
复制
val handlersModule = module {
    single<SocketHandler> {
        return@single ClassAHandlerImpl()
    }

    single<SocketHandler> {
        return@single ClassBHandlerImpl()
    }

...
}

但是,我得到了一个异常

代码语言:javascript
复制
Caused by: org.koin.core.error.DefinitionOverrideException: Definition '[Single:'com.example.handlers.SocketHandler']' try to override existing definition. Please use override option or check for definition '[Single:'com.example.handlers.SocketHandler']'
EN

回答 1

Stack Overflow用户

发布于 2020-11-30 22:14:09

Koin不知道要检索哪个SocketHandler实例,因为它在模块中定义了两次。

您应该使用命名参数:

代码语言:javascript
复制
val handlersModule = module {
    single<SocketHandler>(named("SocketHandlerA")) {
        return@single ClassAHandlerImpl()
    }

    single<SocketHandler>(named("SocketHandlerB")) {
        return@single ClassBHandlerImpl()
    }

...
}

然后你可以在你的类中注入:

代码语言:javascript
复制
private val socketHandler by inject<SocketHandler>(named("SocketHandlerA"))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64802419

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档