首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在运行时使用dagger-2在android中调用类方法

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

Stack Overflow用户
提问于 2019-04-12 05:10:05
回答 1查看 249关注 0票数 0

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

代码语言:javascript
复制
data class MyRequestObj(type : Int, someInfo : String) 

上面的类是我发送到路由的请求对象。

代码语言:javascript
复制
interface RequestHandler{
 fun performRequest(someInfo : String)
}

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

代码语言:javascript
复制
class Handler1 : RequestHandler{
  @Override
  fun performRequest(someInfo : String){

  }
}

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

  }
}

实现RequestHandler的上述处理程序类

代码语言:javascript
复制
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)
    }
  }
 }

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

有人能帮我吗。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-12 15:45:39

使用map 多重绑定创建处理程序的可注入映射。您可以使用Class作为处理程序的密钥。

Map<Class<?>, Provider<RequestHandler>>

代码语言:javascript
复制
@Module
class HandlerModule {

    @Provides @IntoMap
    @ClassKey(Handler1.class)
    fun provideHandler1() : RequestHandler {
        return Handler1()
    }

    @Provides @IntoMap
    @ClassKey(Handler1.class)
    fun provideHandler2() : RequestHandler {
        return Handler2()
    }

}

然后,您可以在Router类中插入映射:

代码语言:javascript
复制
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)
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55644854

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档