Как вызвать метод класса во время выполнения, используя dagger-2 в Android - PullRequest
0 голосов
/ 12 апреля 2019

В моем приложении я получу различные запросы из одного источника, моя задача - перенаправить запрос их конкретному обработчику. так как мое приложение использует кинжал, я не могу направить запрос во время выполнения.

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)
    }
  }
 }

Приведенный выше класс направляет запрос, моя проблема в том, что я не хочу вставлять все свои обработчики в конструктор, мне нужно внедрить их во время выполнения, используя @ Named в кинжале или любым другим способом на основе по своему типу.

Может ли кто-нибудь помочь мне с этим.

1 Ответ

2 голосов
/ 12 апреля 2019

Используйте карту 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)
    }
}
...