正确的位置放置注入属性在匕首加模块

时间:2013-11-20 16:23:14

标签: android dependency-injection dagger

我有一个疑问,当有加号图时,哪个是在匕首中设置injects属性(不是注释)的正确位置。

我们有这种情况:

@Module(injects = ClassWithInjects.class, complete = false)
public final class BaseModule {

  @Provides
  DependencyA providesA() { return new A(); }
  @Provides
  DependencyB providesB() { return new B(); }
  ...
}

class ClassWithInjects {
  @Inject
  A a;
  @Inject
  B b;
}

在执行时工作正常:

ObjectGraph graph = ObjectGraph.create(new BaseModule()).plus(new Object[0]); // no modules used to plus by default
graph.inject(new ClassWithInjects());

之后我们添加了一个新模块,该模块是唯一应该从那时起提供B的模块:

@Module(injects = ClassWithInjects.class, complete = false)
public final class BaseModule {

  @Provides
  DependencyA providesA() { return new A(); }
  ...
}

@Module(addsTo = BaseModule.class, complete = false)
public final class AdditionalModule {
  @Provides
  DependencyB providesB() { return new B(); }
}

class ClassWithInjects {
  @Inject
  A a;
  @Inject
  B b;
}

失败了
  

IllegalStateException类不需要B的绑定   ClassWithInjects

这样做:

ObjectGraph graph = ObjectGraph.create(new BaseModule()).plus(new AdditionalModule());
graph.inject(new ClassWithInjects());

当我移动

时它会起作用
  

injects = ClassWithInjects.class

从BaseModule到AdditionalModule的属性。

那么,在使用plus'ed模块时,我应该在哪里放置injects属性?它是否必须位于调用.plus(...)的参数模块之一?

根据this github issue,我必须将注入放在具有实例绑定的模块中,我尝试将依赖项注入(上例中的ClassWithInjects)但是,如果我有几个模块提供不同的内容,该怎么办?需要绑定才能实现该实例的所有依赖关系?我是否必须创建一个包含所有其他模块并放入injects属性的模块?

1 个答案:

答案 0 :(得分:0)

您是否在此处看过Android示例:https://github.com/square/dagger/tree/master/examples/android-activity-graphs/src/main/java/com/example/dagger/activitygraphs

将该设置与您拥有的设置进行比较,“注入”是在加上的模块上定义的。我认为目前的限制是,如果你有多个,你必须在每个加号模块上定义那些。