Android 使用自定义限定符的Dagger多重绑定
我有一个名为Android 使用自定义限定符的Dagger多重绑定,android,dependency-injection,dagger-2,dagger,multibinding,Android,Dependency Injection,Dagger 2,Dagger,Multibinding,我有一个名为SettingHandler的接口,负责处理与Android应用程序中特定设置相关的事件 interface SettingHandler { fun onHandleEvent(event: SettingEvent) fun candleHandleEvent(event: SettingEvent): Boolean fun getSettingId(): SettingId } 那么假设我有以下匕首模块: @Module object Set
SettingHandler
的接口,负责处理与Android应用程序中特定设置相关的事件
interface SettingHandler {
fun onHandleEvent(event: SettingEvent)
fun candleHandleEvent(event: SettingEvent): Boolean
fun getSettingId(): SettingId
}
那么假设我有以下匕首模块:
@Module
object SettingsModule {
@Provides
fun provideSettingPresenter(
view: SettingsContract.View,
settingHandlers: Set<@JvmSuppressWildcards SettingHandler>
): SettingsPresenter {
//
}
@Provides
@IntoSet
fun provideSettingHandlerA(
dependencyA: A,
dependencyB: B
): SettingHandler {
//
}
@Provides
@IntoSet
fun provideSettingHandlerB(
settingHandlerC: Provider<SettingHandler>
): SettingHandler {
//
}
@Provides
@IntoSet
fun provideSettingHandlerC(
settingHandlerB: Provider<SettingHandler>
): SettingHandler {
//
}
}
SettingId
基本上是一个枚举,包含所有可能的设置常量。因此,现在我的SettingHandler
s模块如下所示:
@Module
object SettingsModule {
@Provides
fun provideSettingPresenter(
view: SettingsContract.View,
settingHandlers: Set<@JvmSuppressWildcards SettingHandler>
): SettingsPresenter {
//
}
@Provides
@SettingHandlerType(SettingId.A)
fun provideSettingHandlerA(
dependencyA: A,
dependencyB: B
): SettingHandler {
//
}
@Provides
@SettingHandlerType(SettingId.B)
fun provideSettingHandlerB(
@SettingHandlerType(SettingId.C)
settingHandlerC: Provider<SettingHandler>
): SettingHandler {
//
}
@Provides
@SettingHandlerType(SettingId.C)
fun provideSettingHandlerC(
@SettingHandlerType(SettingId.B)
settingHandlerB: Provider<SettingHandler>
): SettingHandler {
//
}
}
@模块
对象设置模块{
@提供
有趣的节目主持人(
视图:设置合同。视图,
settingHandlers:设置
):设置重置中心{
//
}
@提供
@SettingHandlerType(SettingId.A)
乐趣提供安顿汉德拉(
A:A,
依赖性B:B
):设置处理程序{
//
}
@提供
@SettingHandlerType(SettingId.B)
有趣的事(
@SettingHandlerType(SettingId.C)
settingHandlerC:提供程序
):设置处理程序{
//
}
@提供
@SettingHandlerType(SettingId.C)
乐趣提供安顿酒店(
@SettingHandlerType(SettingId.B)
settingHandlerB:提供程序
):设置处理程序{
//
}
}
问题来了。Mutlibinding现在不起作用,因为我所有的SettingHandler
都用@SettingHandlerType
注释进行了注释,并且我正在注入SettingsPresenter
的集合也需要注释。但是,例如,使用@SettingHandlerType(SettingId.A)
对其进行注释将不起作用,因为在这种情况下,集合将只包含具有该特定限定符的设置处理程序(SettingHandlerA
,在这种情况下)。因为我真的不想提供另一个我将自己构造的提供程序方法,所以如何使用多重绑定来构造集合数据结构
任何帮助都将不胜感激。提前感谢。您需要两种不同类型的数据:类型为
@SettingHandlerType(/*…*/)SettingHandler
的单个处理程序和类型为set
的一组处理程序。我认为最好的办法是让每个定义都有一个@Binds@IntoSet
补充
@Binds @IntoSet abstract fun bindSettingHandlerA(
@SettingHandlerType(SettingId.A) handler: SettingHandler): SettingHandler
不幸的是,由于您在Kotlin中将其定义为一个对象
,因此在同一个对象上放置必需的抽象
@Binds
方法稍微复杂一些。您可能需要采用这些其他解决方案中的一种,以使该拓扑与您的案例配合使用,包括使用伴生对象
捕获其他方面的-静态
@提供了
方法:
- (爪哇)
@Binds @IntoSet abstract fun bindSettingHandlerA(
@SettingHandlerType(SettingId.A) handler: SettingHandler): SettingHandler