我们说我有两个限定符:@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
限定符相同的情况。
是否可以缩短此代码,删除重复并告诉Dagger:如果某人需要使用A
限定符注释@X
实例,请通过传递@X
注释B
来创建它实例
答案 0 :(得分:1)
目前(截至Dagger 2.16),无法以编程方式表达一组您所描述的相应绑定,其中@A Foo
消费@A Bar
且@A Bar
消费@A Baz
。每个@Binds
,@BindsInstance
或@Provides
只处理一个绑定,Dagger不会将它们相互关联。
如果您有一小组输入和输出的绑定管道而没有独立配置,您可以选择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();
}
}