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

问题描述 投票:0回答:1

说我有这样的事情:

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

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

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

dagger-2
1个回答
1
投票

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

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

  1. 降低Parameter作为类的可见性。如果Parameter是package-private,那么您将无法从该Java包外部引用它,从而为您提供所需的封装。
  2. 使用"Subcomponents for Encapsulation",在其中创建子组件,在子组件上绑定的Module中安装Parameter(和任何相关绑定),并在子组件的接口上仅显示ActualThing。您的子组件将是可注射的,但您的参数不是;您还可以编写一个@Provides方法,从您的子组件实例返回ActualThing。
  3. 咧嘴笑,并且只记录参数是一个不应在某些包之外访问的实现细节。如果您通过组件界面向访问ActualThing的外部团队提供对象,您可以简单地拒绝将Parameter放在公共接口上;如果您向内部团队提供对象,他们可能有权更改您的Dagger结构或访问修饰符。您可能还会问自己为什么参数对其他团队有用,并且如果有注入的业务原因将其记录为API。
© www.soinside.com 2019 - 2024. All rights reserved.