Используя Dagger 2, как я могу иметь один ServiceManager, отвечающий за жизненный цикл нескольких Сервисов, загруженных из нескольких зависимостей компонентов? - PullRequest
0 голосов
/ 26 февраля 2020

Я пытаюсь найти способ для компонента 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 для доступа к нескольким экземплярам одинакового типа, предоставляемым либо зависимости компонентов или модули, избегая дублирующейся ошибки зависимости "?

...