问题描述
我有一个SocketHandler接口和另外两个实现该接口的类。 我想在多个处理程序中实现此接口,并通过koin注入它们。
public class Navigate {
public static Performable toTheHomePage() {
return Task.where("{0} opens the Etsy home page",Open.url("https://www.etsy.com/").then(DoubleClick.on(CookieDialog.ACCEPT_BUTTON))
);
}
public static Performable toTheyourProfilePage() {
return Task.where("{0} views their profile details",Click.on(MenuBar.PROFILE_PIC).then(Click.on(MenuBar.VIEW_YOUR_PROFILE))
);
}
public static Performable toTheShoppingBasket() {
return Task.where("{0} views the shopping basket",Click.on(MenuBar.BASKET)
);
}
}
以及这些类的Koin模块实现
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
) {
....
}
}
但是我得到一个例外
val handlersModule = module {
single<SocketHandler> {
return@single ClassAHandlerImpl()
}
single<SocketHandler> {
return@single ClassBHandlerImpl()
}
...
}
解决方法
Koin不知道要检索哪个SocketHandler
实例,因为它在模块中定义了两次。
您应该使用命名参数:
val handlersModule = module {
single<SocketHandler>(named("SocketHandlerA")) {
return@single ClassAHandlerImpl()
}
single<SocketHandler>(named("SocketHandlerB")) {
return@single ClassBHandlerImpl()
}
...
}
然后您可以插入您的课程:
private val socketHandler by inject<SocketHandler>(named("SocketHandlerA"))