具有混合范围的Dagger2模块

时间:2016-01-04 21:45:37

标签: java dependency-injection scope dagger dagger-2

我目前正在尝试使用子组件设置自定义范围的dagger2,而我在使用dagger编译器时遇到了一些麻烦。更具体地说,我有以下设置:

  @Qualifier @interface Foo {}
  @Qualifier @interface Baz {}
  @Scope @interface SomeScope {}

  @Module
  static class Amodule {
    @Provides
    @SomeScope
    @Foo
    String provideFoo(@Baz String baz) {
      return "foo" + baz;
    }

    @Provides
    @Baz
    String provideBaz() {
      return "baz";
    }
  }

  @Component(modules = Amodule.class)
  interface Acomponent {  
    @Baz String baz();
    Subcomp subcomp();
  }

  @SomeScope
  @Subcomponent
  interface Subcomp {
    @Foo String foo();
  }

不幸的是,这给了我错误:

Acomponent (unscoped) may not reference scoped bindings:
  @Component(modules = AModule.class)
  ^
      @Provides @SomeScope @Foo String Amodule.provideFoo(@Baz String)

我已经设法通过将所有自定义范围绑定拆分为单独的模块来实现工作,但我不确定为什么上面的设置不可能。另外,就我而言,Foo和Baz对象密切相关,所以如果可以避免,我宁愿不将它们分成单独的模块。

任何人都可以解释为什么匕首编译器不接受上面的例子?似乎@SomeScope子组件内部应该是公开@Foo绑定的有效位置。我是否误解了某些内容,或者这可能是对codegen完成方式的限制?

由于

1 个答案:

答案 0 :(得分:1)

您获得的错误与您的子组件无关。

您需要将Acomponent设置为@SomeScope。您不能提供与未范围组件不同的范围。 documentation州:

  

由于Dagger 2将图中的范围实例与组件实现的实例相关联,因此组件本身需要声明它们要表示的范围。例如,在同一个组件中使用@Singleton绑定和@RequestScoped绑定没有任何意义,因为这些范围具有不同的生命周期,因此必须存在于具有不同生命周期的组件中。

添加范围,这应该有效。

@SomeScope
@Component(modules = Amodule.class)
interface Acomponent {  
    @Baz String baz();
    Subcomp subcomp();
}