在我的应用程序中,我将从单个源获取各种请求,我的工作是将请求路由到它们的特定处理程序。由于我的应用程序使用匕首,所以无法在运行时路由请求。
data class MyRequestObj(type : Int, someInfo : String) 上面的类是我发送到路由的请求对象。
interface RequestHandler{
fun performRequest(someInfo : String)
}我将在所有处理程序类中扩展上述接口。
class Handler1 : RequestHandler{
@Override
fun performRequest(someInfo : String){
}
}
class Handler2 : RequestHandler{
@Override
fun performRequest(someInfo : String){
}
}实现RequestHandler的上述处理程序类
class Router @Inject constructor(handler1 : Handler1, handler2 :Handler2) {
fun routeRequest(request : MyRequestObj){
when(request.type){
TYPE1 -> handler1.performRequest(request.someInfo)
TYPE2 -> handler2.performRequest(request.someInfo)
}
}
}上面的类路由请求,我的问题是我不想在构造函数中注入我的所有处理程序,我需要在运行时使用@命名的(匕首语)或基于其类型的任何其他方式注入它们。
有人能帮我吗。
发布于 2019-04-12 15:45:39
使用map 多重绑定创建处理程序的可注入映射。您可以使用Class作为处理程序的密钥。
Map<Class<?>, Provider<RequestHandler>>
@Module
class HandlerModule {
@Provides @IntoMap
@ClassKey(Handler1.class)
fun provideHandler1() : RequestHandler {
return Handler1()
}
@Provides @IntoMap
@ClassKey(Handler1.class)
fun provideHandler2() : RequestHandler {
return Handler2()
}
}然后,您可以在Router类中插入映射:
class Router @Inject constructor(
val handlerProviders: Map<Class<out RequestHandler>,
@JvmSuppressWildcards Provider<RequestHandler>>) {
fun routeRequest(request: MyRequestObj) {
val handler = when (request.type) {
TYPE1 -> handlerProviders.get(Handler1::class.java).get()
TYPE2 -> handlerProviders.get(Handler2::class.java).get()
else -> null
}
handler?.performRequest(request.someInfo)
}
}https://stackoverflow.com/questions/55644854
复制相似问题