Я пытаюсь найти способ для компонента root, чтобы он мог запускать несколько экземпляров Guava Service
, предоставляемых либо через зависимости компонентов, либо внутренне, используя один Guava ServiceManager
.
Для осязаемый (сломанный) пример, скажем, у нас есть две очень простые зависимости компонентов, которые определены как:
public interface ClockComponent {
Clock clock();
Set<Service> services();
}
public interface IdComponent {
IdService idService();
Set<Service> services();
}
Затем у нас есть компонент root, как определено:
@Module
public interface RootModule {
@Provides
@IntoSet
@Singleton
static Service provideService() {
return new RootService();
}
}
@Singleton
@Component(dependencies = {ClockComponent.class, IdComponent.class}, modules = {RootModule.class})
public interface RootComponent {
@Component.Builder
interface Builder {
Builder clockComponent(ClockComponent component);
Builder idComponent(IdComponent component);
RootComponent build();
}
}
Это, очевидно, не скомпилируется из-за дублирующих ошибок привязки.
Есть ли способ выполнить загрузку служб централизованно, чтобы был только один ServiceManager
? Это дает много преимуществ, в том числе четко определенную модель многопоточности.
Похоже, что это должно быть распространенным случаем. Я бы предпочел не заставлять запускать все отдельные сервисы компонентов внутри компонентов.
Этот вопрос можно обобщить так: «Существует ли соглашение Dagger 2 для доступа к нескольким экземплярам одинакового типа, предоставляемым либо зависимости компонентов или модули, избегая дублирующейся ошибки зависимости "?