在Dagger @Module中,“injects”应该放什么?

3

作为一个使用Guice的用户,我想要了解一下Dagger的优点。以下是我的问题:

假设我有以下代码:

MyActivity.java
---------------
public class MyActivity {
  @Inject MyImplicitClass myImplicitClass;
  @Inject @Named("foo") MyExplicitClass myNamedExplicitClass;
  ...
}

MyImplicitClass.java
------------
public class MyImplicitClass {
   @Inject
   MyImplicitClass(MyExplicitClass myExplicitClass) {
     ...
   }
   ...
}

MyModule.java
---------------
@Module(injects = { ? }) {
  @Provides provideExplicitClass() {
    return new MyExplicitClass();
  }
  @Named("foo") @Provides provideNamedExplicitClass() {
    return new MyExplicitClass();
  }
}

那么,我的问题是,在Injects中应该放什么?

我知道MyActivity需要加入。或者说,无论什么“this”,都需要DaggerInjector.inject(this)

还需要加入其他东西吗? 需要为Dagger构造注入类(MyImplicitClass)和/或在模块中明确提供的类(MyExplicitClass)进行指定吗?

如果我需要对MyExplicitClass进行注释,这对它甚至没有意义。

然而,Javadoc让我觉得应该包容错误。 http://square.github.io/dagger/javadoc/dagger/Module.html#injects()

1个回答

4
Dagger 1在编译时进行验证,因此需要在运行时使用所有入口点(objectgraph.get(entrypoint), objectgraph.inject(entrypoint))。入口点是依赖图的顶部可注入类。在Android中,大多数情况下,这些是您的Activities、Fragments、Services和Broadcast Receivers。这些组件都不是由Dagger创建的。您还可以列出那些不属于任何入口点依赖树的类,使它们成为自己的入口点。这些入口点用于Dagger的验证。Dagger将从入口点开始验证,并沿着依赖树向下遍历,并验证Modules中带有@Inject和@Provides注释的依赖项。因此,总结一下,在@Module(injects = { * })中只需要提供入口点。根据您的示例代码,如果您有像这样的东西,则不需要在@Module(injects={})中指定MyImplicitClass为MyActivity入口点的@Inject依赖项。对于MyExplicitClass依赖项也是如此。因此,从您的示例中,唯一需要添加到列表中的类实际上是MyActivity。
// MyIndependantClass.java
-----------------
public class MyIndependantClass {
    @Inject
    MyIndependantClass(MyExplicitClass myExplicitClass) {
    }
}

// MyActivity.java
---------------
public class MyActivity {
  @Inject MyImplicitClass myImplicitClass;
  @Inject @Named("foo") MyExplicitClass myNamedExplicitClass;
  ...

  protected void onCreate (Bundle savedInstanceState) {
    MyIndependantClass myIndependantClass = MyObjectGraph.get(MyIndependantClass.class);
    ...
  }
}

由于MyIndependantClass是使用ObjectGraph.get()创建的,而不是您的MyActivity入口点的直接依赖项,因此您需要将该类声明为injects列表的一部分。
// MyModule.java
---------------
@Module(injects = { MyActivity.class, MyIndependantClass.class }) {
  @Provides provideExplicitClass() {
    return new MyExplicitClass();
  }
  @Named("foo") @Provides provideNamedExplicitClass() {
    return new MyExplicitClass();
  }
}

对我来说不清楚的是通过Object.get检索到的对象部分。我理解为可以通过这种方式检索到的任何东西,这意味着每个对象都可以。只有注入树中的“叶子”对象才是完全合理的。 - Bernardo Cunha

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接