gpt4 book ai didi

android - Dagger 2 - 了解进行字段和方法注入(inject)的不同方式

转载 作者:行者123 更新时间:2023-11-29 23:22:52 25 4
gpt4 key购买 nike

我知道应该尽可能首选构造函数注入(inject),但为了理论上的理解,我想了解更多有关字段和方法注入(inject)的信息。

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

方法注入(inject)示例:

@Inject

public void enableStreaming(Streaming streaming) {

streaming.register(this);

}

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

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

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

  1. 你有什么时候注入(inject)与构造函数注入(inject)?
  2. 你有方法注入(inject)组合的例子吗使用构造函数注入(inject)(因此需要显式的 inject 调用)?
  3. 对于这两种情况,我想知道有没有什么情况component.inject() 方法是从外部还是从对象内部调用的,它的用例是什么。有没有一个我们调用的场景

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

在 exampleObject 上执行字段或方法注入(inject)?

最佳答案

我手边没有已发布的或官方的示例,但您描述的所有情况都可以正常工作。字段注入(inject)与构造函数注入(inject)相结合是不常见的,因为字段必然是非 final 的。与字段注入(inject)一起工作,如果通过构造函数传递,它们可能是最终的。对于与 enableStreaming 类似的自注册案例,在没有构造函数注入(inject)的情况下看到方法注入(inject)并不罕见。你在上面写的方法,但这仍然是一个不寻常的用例。

虽然字段和方法注入(inject)可能发生在被注入(inject)的方法或类中,但这需要接收特定的组件实例或 MembersInjector<T>。为你的类(class)T , 这至少和 component.inject(exampleObject) 一样麻烦在上面的第三个例子中。毕竟,依赖注入(inject)的全部意义在于允许调用者控制类的依赖项,因此可以说,让拥有类控制是否以及如何提供其依赖项是 DI 的弱化。

我能想到的唯一一个类可以管理自己的注入(inject)的情况是,如果你的类想要有条件地注入(inject)自己——if (BuildOptions.FEATURE_X_ENABLED) { injector.inject(this); } ——但许多其他模式会浮现在脑海中,可以更好地处理这种情况。

关于android - Dagger 2 - 了解进行字段和方法注入(inject)的不同方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53971609/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com