Переопределить зависимости в модуле Dagger - PullRequest
0 голосов
/ 19 мая 2018

Есть базовый модуль с общими зависимостями:

@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 голосов
/ 20 мая 2018

Вы связываете каждого как навигатор.Я считаю, что вам нужно использовать другой тип возврата для теневого связывания.

В качестве альтернативы, вы можете попробовать что-то с квалификаторами.Определить пользовательский классификатор легко;Вы должны быть в состоянии найти примеры в Интернете.Я бы поделился этим, но я сейчас на моем телефоне.

Этот ответ принят, поэтому я хотел бы добавить код, чтобы сделать его более "полным".Вот пример пользовательского «Qualifier» (Kotlin)

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 с, я пожалею, что не получил этого.

...