Параметризованные классификаторы в Dagger2 - PullRequest
0 голосов
/ 30 мая 2018

Допустим, у меня есть два квалификатора: @First и @Second.

В Module я предоставляю два экземпляра класса A - с двумя квалификаторами:

@First
@Provides
static A provideFirstA(@First B b) {
    return new A(b);
}

@Second
@Provides
static A provideSecondA(@Second B b) {
    return new A(b);
}

Как видите, @First аннотированный A экземпляр принимает @First аннотированный B класс в качестве зависимости.Та же ситуация с квалификатором @Second.

Можно ли сократить этот код, удалить дублирование и сказать Кинжалу: если кому-то нужен экземпляр A с аннотацией @X, создайте его, передав @Xаннотированный B экземпляр?

1 Ответ

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

В настоящее время (по состоянию на Dagger 2.16) нет способа программно выразить набор соответствующих привязок, как вы описываете, где @A Foo потребляет @A Bar и @A Bar потребляет @A Baz.Каждый @Binds, @BindsInstance или @Provides обрабатывает ровно одну привязку, и Dagger не связывает их друг с другом.

Если у вас длинный конвейер привязок с небольшим набором входов ивыходные данные и отсутствие независимой конфигурации, вы можете выбрать для представления этого через подкомпонент , где построитель подкомпонента принимает ваш C и возвращает ваш A. Это позволит вам один раз выразить свой конвейер и повторно использовать его для вашего *Привязки 1012 * - @Fifth, которые приближают дочерние инжекторы Guice или частные модули (если вы с ними более знакомы).

@Subcomponent(modules={PipelineImplModule.class})
public interface Pipeline {
  A getA();

  @Subcomponent.Builder public interface Builder {
    @BindsInstance Builder c(C c);
    Pipeline build();
  }
}

@Module
public static class PipelineImplModule {
  @Provides
  static A provideA(B b) {
    return new A(b);
  }

  @Provides
  static B provideB(C c) {
    return new B(c);
  }
}

@Module(subcomponents={Pipeline.class})
public static class PipelineModule {
  @Provides @First
  static A provideFirstA(@First C c, Pipeline.Builder pipelineBuilder) {
    return pipelineBuilder.c(c).build().getA();
  }

  @Provides @Second
  static B provideSecondA(@Second C c, Pipeline.Builder pipelineBuilder) {
    return pipelineBuilder.c(c).build().getA();
  }
}
...