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