Как вводить объекты одного типа - PullRequest
0 голосов
/ 10 мая 2018

У меня есть докладчик, который принимает некоторые параметры.

public WidgetPresenterImpl(WidgetSettingInteractor stateInteractor,
                           WidgetStatisticInteractor statisticApiInteractor,
                           WidgetStatisticInteractor statisticCacheInteractor,
                           Context context) {
    mStateInteractor = stateInteractor;
    mStatisticApiInteractor = statisticApiInteractor;
    mStatisticCacheInteractor = statisticCacheInteractor;
    mContext = context;
}

Инициализация докладчика выглядит следующим образом

WidgetPresenter presenter = new WidgetPresenterImpl(
                new WidgetSettingInteractorImpl(new WidgetRepositoryImpl()),
                new WidgetStatisticInteractorImpl(new WidgetStatisticApiRepositoryImpl()),
                new WidgetStatisticInteractorImpl(new WidgetStatisticCacheRepositoryImpl()),
                context);

Я хотел бы использовать кинжал для инициализации. Для этого я написал модуль

@Module
public abstract class WidgetModule {

@Binds
abstract WidgetPresenter widgetPresenter(WidgetPresenterImpl presenter);

@Binds
abstract WidgetSettingInteractor widgetSettingInteractor(WidgetSettingInteractorImpl settingInteractor);

@Binds
abstract WidgetStatisticInteractor widgetStatisticInteractor(WidgetStatisticInteractorImpl statisticInteractor);

@Binds
abstract WidgetStatisticRepository widgetStatisticApiRepository(WidgetStatisticApiRepositoryImpl apiRepository);

@Binds
abstract WidgetStatisticRepository widgetStatisticCacheRepository(WidgetStatisticCacheRepositoryImpl cacheRepository);

@Binds
abstract WidgetRepository widgetSettingRepository(WidgetRepositoryImpl widgetRepository);

}

Но проект не собирается, есть ошибка

error: [dagger.android.AndroidInjector.inject(T)] ....WidgetStatisticRepository is bound multiple times:
@Binds ....WidgetStatisticRepository ....widgetStatisticApiRepository(....WidgetStatisticApiRepositoryImpl)
@Binds ....WidgetStatisticRepository ....widgetStatisticCacheRepository(....WidgetStatisticCacheRepositoryImpl)

1 Ответ

0 голосов
/ 11 мая 2018

Судя по комментариям, в этом нет необходимости, но, учитывая заданный вопрос, возможно, это поможет.Вот как это может выглядеть:

@Named("Api")
@Binds
abstract WidgetStatisticRepository 
widgetStatisticApiRepository(WidgetStatisticApiRepositoryImpl apiRepository);

@Named("Cache")
@Binds
abstract WidgetStatisticRepository 
widgetStatisticCacheRepository(WidgetStatisticCacheRepositoryImpl cacheRepository);

Затем вы можете просто добавить аннотацию @Inject в конструктор WidgetPresenterImpl (при условии, что у вас есть метод @Provides, возвращающий Context):

@Inject
public WidgetPresenterImpl(WidgetSettingInteractor stateInteractor,
                       @Named("Api") WidgetStatisticInteractor statisticApiInteractor,
                       @Named("Cache") WidgetStatisticInteractor statisticCacheInteractor,
                       Context context) {
    mStateInteractor = stateInteractor;
    mStatisticApiInteractor = statisticApiInteractor;
    mStatisticCacheInteractor = statisticCacheInteractor;
    mContext = context;
}

или предполагая, что вы хотите абстрагировать реализацию интерфейса WidgetPresenter, вы можете создать соответствующий метод @Provides в неабстрактном модуле:

@Module
class WidgetPresenterModule {

        @Provides
        public WidgetPresenter provideWidgetPresenter(WidgetSettingInteractor stateInteractor,
                       @Named("Api") WidgetStatisticInteractor statisticApiInteractor,
                       @Named("Cache") WidgetStatisticInteractor statisticCacheInteractor,
                       Context context) {
            return new WidgetPresenterImpl(stateInteractor, statisticApiInteractor, statisticCacheInteractor, context);
    }
}
...