在我的应用程序中,我将从单一来源获得各种请求,我的工作是将请求路由到他们的特定处理程序。因为我的应用程序使用匕首无法在运行时路由请求。
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)
}
}
}
上面的类路由请求,我的问题是我不想在构造函数中注入我的所有处理程序,我需要在运行时使用@agamed在dagger或基于其类型的任何其他方式注入它们。
谁能帮我这个。
使用map Multibindings创建处理程序的可注入映射。您可以使用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)
}
}