Как в Dagger создать объекты с разным Component при помощи @Binds?
У меня стоит задача при помощи даггера создать объекты с разным ЖЦ.
Один модуль провайдит синглтоны:
@Module
@InstallIn(SingletonComponent::class)
object RepoModule {
@Provides
fun provideMyRepository(/* Зависимости */): MyRepository = MyRepositoryImpl( /* Зависимости */ )
}
Другой модуль провайдит объекты для вьюмодели, и поэтому у них ViewModelComponent. И кроме того я делаю Binds для того, чтобы забиндить репозиторий в юзкейс (сделал как в разделе Satisfying Dependencies документации даггера):
@InstallIn(ViewModelComponent::class)
@Module
abstract class BindRepoModule {
@Binds
abstract fun bindMyRepository(myRepositoryImpl: MyRepositoryImpl): MyRepository
}
@InstallIn(ViewModelComponent::class)
@Module
object ViewModelModule {
// Все юзкейсы, используемые во вьюмодели и вызывающие MyRepository, провайдятся тут
@Provides
fun provideMyUseCase(myRepository: MyRepository): MyUseCase = MyUseCase(myRepository = myRepository)
}
И в итоге при попытке сбилдить я натыкаюсь на такую ошибку:
/Users/user/StudioProjects/bank-mobile-android/app/build/generated/hilt/component_sources/gmsDebug/ru/bank/mobile/app/App_HiltComponents.java:986: error: [Dagger/DuplicateBindings] ru.bank.mobile.cards.reissue.common.domain.repository.CardReissueRepository is bound multiple times:
public abstract static class SingletonC implements FragmentGetContextFix.FragmentGetContextFixEntryPoint,
^
@Binds ru.bank.mobile.cards.reissue.common.domain.repository.CardReissueRepository ru.bank.mobile.cards.reissue.common.di.CardReissueRepositoryModule.bindCardReissueRepository(ru.bank.mobile.cards.reissue.common.data.repository.CardReissueRepositoryImpl)
@Provides ru.bank.mobile.cards.reissue.common.domain.repository.CardReissueRepository ru.bank.mobile.cards.reissue.common.di.DeeplinkModule.provideCardReissueRepository(ru.bank.mobile.cards.reissue.common.data.api.CardReissueApiService, ru.bank.mobile.cards.reissue.common.domain.mapper.CardReissueReasonMapper, ru.bank.mobile.cards.reissue.common.domain.mapper.CardReissueClientIncomeMapper, ru.bank.mobile.cards.reissue.common.domain.mapper.CardReissueWaitingDeliveryMapper, ru.bank.mobile.cards.reissue.common.domain.mapper.CardReissueErrorMapper, ru.bank.mobile.cards.reissue.common.domain.mapper.CardReissueBranchInfoMapper, ru.bank.mobile.cards.reissue.common.domain.mapper.CardReissueSigningMapper, ru.bank.mobile.cards.reissue.common.domain.mapper.CardReissueTariffChangeMapper, ru.bank.mobile.cards.reissue.common.domain.mapper.AddressSuggestionMapper, ru.bank.mobile.cards.reissue.common.domain.mapper.DateAndTimeDeliveryDataMapper, ru.bank.mobile.cards.reissue.common.domain.mapper.ToOtpDataMapper, ru.bank.mobile.cards.reissue.common.domain.mapper.ReissueAcceptedDataMapper, @Named("filesDir") java.io.File, ru.bank.mobile.legacyresources.domain.UserRepository)
ru.bank.mobile.cards.reissue.common.domain.repository.CardReissueRepository is injected at
ru.bank.mobile.cards.reissue.common.di.CardReissueModule.provideRequestOtpCodeUseCase(cardReissueRepository)
ru.bank.mobile.cards.reissue.common.domain.usecase.RequestOtpCodeUseCase is injected at
ru.bank.mobile.cards.reissue.mainProcess.presentation.signing.CardReissueSigningViewModel(…, requestOtpCodeUseCase, …)
ru.bank.mobile.cards.reissue.mainProcess.presentation.signing.CardReissueSigningViewModel is injected at
ru.bank.mobile.cards.reissue.mainProcess.presentation.signing.CardReissueSigningViewModel_HiltModules.BindsModule.binds(arg0)
@dagger.hilt.android.internal.lifecycle.HiltViewModelMap java.util.Map<java.lang.Class<?>,javax.inject.Provider<androidx.lifecycle.ViewModel>> is requested at
dagger.hilt.android.internal.lifecycle.HiltViewModelFactory.ViewModelFactoriesEntryPoint.getHiltViewModelMap() [ru.bank.mobile.app.App_HiltComponents.SingletonC → ru.bank.mobile.app.App_HiltComponents.ActivityRetainedC → ru.bank.mobile.app.App_HiltComponents.ViewModelC]
Даггер ругается на то, что репозиторий биндится несколько раз, хотя это не так. В чем может быть проблема и как её пофиксить?