В настоящее время (по состоянию на 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();
}
}