Dagger2中的参数化限定符

时间:2018-05-30 13:03:20

标签: dagger-2

我们说我有两个限定符:@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来创建它实例

1 个答案:

答案 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();
  }
}