匕首2-了解进行字段和方法注入的不同方法

时间:2018-12-29 17:06:50

标签: android dependency-injection dagger-2 dagger

我知道应该尽可能使用构造函数注入,但是出于理论上的理解,我想了解有关字段和方法注入的更多信息。

方法注入显然是非常罕见的,根据Jake Wharton的说法,唯一的用例是必须将依赖对象的实例传递给依赖项(因为它可能尚未在构造函数中完全实例化) )。

方法注入示例:

@Inject

public void enableStreaming(Streaming streaming) {

    streaming.register(this);

}

字段方法向依赖对象的注入过程可以通过两种方式触发:

  1. 结合构造函数注入,在这种情况下 它在构造函数运行后自动执行(无需在组件上调用inject)。这就是示例中发生的情况 上面(我省略了构造函数,想象它被@Inject注释了)
  2. 没有构造函数注入,如果该对象已经实例化。 在这种情况下,我们需要一种成员注入方法,其中 我们传递对象。然后,当我们 致电component.inject(object),最常用于 现场注入活动和碎片。

我要的是相反情况的示例。

  1. 您是否有将油田注入与 构造函数注入?
  2. 您有没有关于方法注射组合的示例 进行构造函数注入(因此需要显式的inject调用)?
  3. 对于这两种情况,我都想知道 component.inject()方法是从对象的外部或内部调用的,其用例是什么。有没有过 我们称之为的情况

    ExampleObject exampleObject = new ExampleObject(); component.inject(exampleObject);

要在exampleObject上执行字段或方法注入?

1 个答案:

答案 0 :(得分:1)

我没有方便的发布或官方示例,但是您描述的所有情况都可以正常工作。字段注入与构造函数注入结合使用是不常见的,因为字段必须非final才能与字段注入一起使用,如果通过构造函数传递,则字段可能是最终字段。对于类似于您上面编写的enableStreaming方法的自注册案例,很少看到没有构造函数注入的方法注入,但这仍然是一个不寻常的用例。

尽管字段和方法注入可能在被注入的方法或类内进行,但这将有必要为您的类MembersInjector<T>接收特定的Component实例或T,这至少同样麻烦在上面的第三个示例中以component.inject(exampleObject)的身份调用。毕竟,依赖项注入的全部要点是允许调用者控制类的依赖项,因此,可以认为拥有类控制是否以及如何提供其依赖项是DI的弱项。

我唯一能想到的一个类将在哪里管理类的情况是,如果您的类想有条件地自我注入(if (BuildOptions.FEATURE_X_ENABLED) { injector.inject(this); }),但想到的其他许多模式会更好地处理这种情况。