如何在 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)
}
}
在我的应用程序中,我将从单一来源获取各种请求,我的工作是将请求路由到它们的特定处理程序。由于我的应用程序使用匕首,因此无法在 运行 时间路由请求。
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)
}
}