目前(从Dagger2.16开始)没有办法像您描述的那样以编程方式表示一组对应的绑定,其中
@A Foo
消耗
@A Bar
和
A酒吧
消耗
@A Baz
. 各
@Binds
,
@BindsInstance
或
@Provides
只处理一个绑定,匕首不会将它们彼此关联。
如果绑定的管道很长,只有一小部分输入和输出,并且没有独立的配置,则可以选择
represent this through a subcomponent
,其中子组件生成器接受您的c并返回您的a。这将允许您只表达一次管道,并将其重新用于
@First
通过
@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();
}
}