代码之家  ›  专栏  ›  技术社区  ›  Piotr Aleksander Chmielowski

Dagger2中的参数化限定符

  •  0
  • Piotr Aleksander Chmielowski  · 技术社区  · 6 年前

    @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);
    }
    

    如你所见, @第一 带批注的 实例获取 @第一 注释的 B 类作为依赖项。同样的情况 @第二 限定符。

    是否可以缩短此代码,删除重复并告诉dagger:如果有人需要 实例注释为 @X @ 注释的 实例?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Jeff Bowman    6 年前

    目前(从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();
      }
    }