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

问题描述 投票:0回答:1

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

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或基于其类型的任何其他方式注入它们。

谁能帮我这个。

android dependency-injection dagger-2 dagger
1个回答
2
投票

使用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)
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.