我有以下接口,叫做 SettingHandler
负责处理与Android应用内部特定设置相关的事件。
interface SettingHandler {
fun onHandleEvent(event: SettingEvent)
fun candleHandleEvent(event: SettingEvent): Boolean
fun getSettingId(): SettingId
}
那么我们假设我有下面的Dagger模块。
@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 {
//
}
}
正如你所看到的,这里没有什么特别的地方,期待着... ... SettingHandlerB
和 SettingHandlerC
提供者方法。它们都相互依赖,所以我决定使用Dagger提供的Provider类来解决这种循环依赖。因为我需要一个设置处理程序的具体实现(SettingHandlerC
对于 SettingHandlerB
和 SettingHandlerB
对于 SettingHandlerC
),我现在需要对它们进行区分。这时就需要一个 @Qualifier
注解的作用。我创建了以下限定符注解来区分不同的实现。
@Qualifier
@Retention(AnnotationRetention.RUNTIME)
@Target(AnnotationTarget.FIELD, AnnotationTarget.FUNCTION, AnnotationTarget.VALUE_PARAMETER)
annotation class SettingHandlerType(val id: SettingId)
SettingId
基本上是一个包含所有可能的设置常量的枚举。所以现在我的 SettingHandler
的模块看起来如下。
@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 {
//
}
}
问题来了 现在Mutlibinding不工作了,因为我所有的 SettingHandler
的注释。@SettingHandlerType
注解和一个我要注入到 SettingsPresenter
也需要进行注释。然而,用,例如,注释它。@SettingHandlerType(SettingId.A)
将不起作用,因为在这种情况下,Set将只包含带有该特定限定符的设置处理程序(SettingHandlerA
,在这种情况下)。) 我如何使用多绑定构造Set数据结构,因为我真的不想提供另一个提供者方法,在那里我将自己构造它?
任何帮助都将是非常感激的。先谢谢你。
你想要两种不同类型的数据。类型为 @SettingHandlerType(/*...*/) SettingHandler
和一组类型 Set<SettingHandler>
. 我认为最好的办法是让每个定义都附带一个""。@Binds @IntoSet
补。
@Binds @IntoSet abstract fun bindSettingHandlerA(
@SettingHandlerType(SettingId.A) handler: SettingHandler): SettingHandler
不幸的是,既然你已经把它定义为一个。object
在Kotlin中,要将必要的abstract
@Binds
的方法。你可能需要采用其他的解决方案来使该拓扑结构适用于你的案例,包括使用 companion object
捕捉其他static
@Provides
方法。