覆盖Dagger模块中的依赖项

时间:2018-05-19 09:37:09

标签: android kotlin dagger-2 dagger

有一个具有共同依赖关系的基本模块:

@Module
object CommonActivityModule {

    @JvmStatic
    @Provides
    fun baseNavigator(activity: AppCompatActivity): Navigator = BaseNavigator(activity, SOME_STUFF)

    // other common deps
}

我将它包含在每个Activity模块中以获取这些常见的deps。但是在某些模块中,我想要将一些基本接口实现与另一个模块相混淆:

@Module(includes = [CommonActivityModule::class])
interface SomeActivityModule {

    @Binds
    fun anotherNavigator(anotherNavigator: AnotherNavigator): Navigator    

    // other module's binds
}

它使..Navigator is bound multiple times - 异常。有没有办法在不放弃整个CommonActivityModule的情况下替换这些接口实现?

1 个答案:

答案 0 :(得分:1)

您将每个绑定为导航器。我相信你需要在你的阴影绑定上使用不同的返回类型。

或者,您可以尝试使用限定符。定义自定义限定符很容易;你应该能够在网上找到例子。我分享了一个,但我现在在手机上。

此答案已被接受,因此我想添加一些代码以使其更加完整"。以下是定制"限定符"的示例。 (科特林)

import javax.inject.Qualifier

@Qualifier
@Retention(AnnotationRetention.RUNTIME)
annotation class DelayQualifier

用法:

@Module object {
    @Provides @DelayQualifier @JvmStatic
    fun provideDelay(): Long = if (BuildConfig.DEBUG) 1L else 3L
}

@ActivityScoped
class SignupViewModelFactory @Inject constructor(
    @param:DelayQualifier private val delay: Long
) : ViewModelProvider.Factory { ... }

这是我目前在我的项目中注入的唯一Long,所以我不需要 限定符。但如果我决定要更多Long s,我很遗憾不会对此进行排位。