【问题标题】:Dagger2 modules with mixed scopes具有混合范围的 Dagger2 模块
【发布时间】:2016-04-08 14:44:17
【问题描述】:

我目前正在尝试使用子组件使用自定义范围设置 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 绑定的有效位置。我是否误解了某些东西,或者这可能是对代码生成方式的限制?

谢谢

【问题讨论】:

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


    【解决方案1】:

    您遇到的错误与您的子组件无关。

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

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

    添加范围,这应该可以工作。

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

    【讨论】:

    • 非常感谢您的回复。但是,我想知道的一件事是这如何推广到多个范围?我问是因为在我的真实示例中,例如,我希望 AComponent 也能够 @Provide 单例范围绑定。另外,我不太确定我的原始示例如何与文档相矛盾:AComponent 将是无范围的,仅提供无范围的(或单例)绑定,而 Subcomp 将是 @SomeScope,提供所有 @SomeScope 绑定。
    • @Dino 简而言之,一个无作用域的组件不能有作用域的模块。如果您想提供@Singleton,您必须对组件应用相同的范围。虽然我不知道无范围的对象会发生什么
    • 好的,这意味着如果我想使用 Singleton 作用域和 SomeScope,我将不得不将不同作用域的 @Provides 方法拆分为不同的模块。目前还不清楚为什么这在实现方面是必要的,但我想这就是它的样子:/
    • @Dino 查看文档的引用:他们希望您在不同的范围内拥有不同的生命周期:)
    • 是的,如果 modules 处理生命周期,那么这是有道理的。我想我最初是希望组件处理生命周期,这会给 Subcomp 管理 @Foo 生命周期留下一些希望,即使该模块在技术上已添加到其父组件中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-19
    • 2016-05-20
    • 2017-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多