Dagger 2-仅在自己的模块中提供实例的正确方法

时间:2019-02-12 17:15:15

标签: dagger-2

说我有这样的东西:

@Module
internal class SeenModule {
  @Provides
  fun parameter() = Parameter()

  @Provides
  fun actualThingINeedToInject(parameter: Parameter) = ActualThing(parameter)
}

但是,该模块实际上仅需要提供一个ActualThing对象-换句话说,仅存在Parameter,因为它自己的模块需要它。我不希望它成为可以在此模块外部检索的依赖项集合的一部分。 我目前这样做的方式是,将自定义范围定义为私有,然后标记提供不应依赖该范围的依赖关系的方法以及应该注入所提供依赖关系的模块中的方法,当然。这有点令人讨厌,因为它使我无法在这些方法中使用其他范围,并且需要在整个地方进行很多附加注释。实现此目标的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

Dagger并没有真正按照您的要求提供“私有绑定”,其中Parameter不能从其他任何地方注入。我还建议不要使用范围注释来提高可见性,部分原因是组件本身需要使用该范围注释进行注释,因此范围注释只会稍微增加不当消耗Parameter所需的麻烦(以及创建Component所需的麻烦)会正确使用参数)。

我将提供以下三种选择之一:

  1. 降低Parameter作为类的可见性。如果Parameter是私有程序包,则您将无法从该Java包外部引用它,从而无法获得所需的封装。

  2. 使用"Subcomponents for Encapsulation",在其中创建子组件,将参数(以及所有相关的绑定)安装在子组件上绑定的模块中,并仅在子组件的界面上公开ActualThing。您的子组件将是可注入的,但您的Parameter不是;您还可以编写一个@Provides方法,该方法从子组件实例返回您的ActualThing。

  3. 咧嘴笑着接受它,只是证明Parameter是一个实现细节,不应在某些程序包之外进行访问。如果您要向通过Component接口访问ActualThing的外部团队提供对象,则可以拒绝将Parameter放在公共接口上;如果您要向内部团队提供对象,那么他们很可能仍然有权更改Dagger结构或访问修饰符。您可能还会问自己,为什么Parameter对于其他团队使用会很有用,并且如果有商业原因需要注入,则将其记录为API。