带有自定义限定符的匕首多重装订器。

问题描述 投票:0回答:1

我有以下接口,叫做 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 {
        //
    }

}

正如你所看到的,这里没有什么特别的地方,期待着... ... SettingHandlerBSettingHandlerC 提供者方法。它们都相互依赖,所以我决定使用Dagger提供的Provider类来解决这种循环依赖。因为我需要一个设置处理程序的具体实现(SettingHandlerC 对于 SettingHandlerBSettingHandlerB 对于 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数据结构,因为我真的不想提供另一个提供者方法,在那里我将自己构造它?

任何帮助都将是非常感激的。先谢谢你。

android dependency-injection dagger-2 dagger multibinding
1个回答
1
投票

你想要两种不同类型的数据。类型为 @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 方法。

© www.soinside.com 2019 - 2024. All rights reserved.