如何在 android 中使用 dagger-2 在运行时调用 class 方法

How to call the class method at runtime using dagger-2 in android

在我的应用程序中,我将从单一来源获取各种请求,我的工作是将请求路由到它们的特定处理程序。由于我的应用程序使用匕首,因此无法在 运行 时间路由请求。

data class MyRequestObj(type : Int, someInfo : String) 

上面的class是我发给路由的请求对象

interface RequestHandler{
 fun performRequest(someInfo : String)
}

我将在所有处理程序中扩展上述接口 classes.

class Handler1 : RequestHandler{
  @Override
  fun performRequest(someInfo : String){

  }
}

class Handler2 : RequestHandler{
  @Override
  fun performRequest(someInfo : String){

  }
}

上面的处理程序 classes 实现了 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)
    }
  }
 }

上面的 class 路由请求,我的问题是我不想在构造函数中注入我的所有处理程序,我需要在 运行 时间使用 [=28= 注入它们]@Named 以匕首或基于其类型的任何其他方式。

谁能帮我解决这个问题。

使用映射 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:

中插入地图
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)
    }
}