我现在和Dagger一起玩,显然有些功能对我不起作用。
我实际上是尝试使用模拟模块扩展我的ObjectGraph(通过ObjectGraph.plus()
),模拟模块覆盖已创建图形中的一个真实模块。但显然我的模拟模块被忽略了,所以调用了真正的接口。
但是,如果我尝试在图形创建阶段提供我的模拟模块 - 一切正常......
在我的情况下,MockModule1
会覆盖RealModule1
不起作用:
objectGraph = ObjectGraph.create(new RealModule1(),
new RealModule2(),
new RealModule3());
objectGraph = objectGraph.plus(new MockModule1());
正常工作
objectGraph = ObjectGraph.create(new RealModule1(),
new RealModule2(),
new RealModule3(),
new MockModule1());
RealModule1.java
@Module(injects = MainActivity.class)
public class RealModule1 {
@Provides
ISomething provideSomething() {
return new Something();
}
}
MockModule1.java
@Module(overrides=true, injects = MainActivity.class)
public class MockModule1 {
@Provides
ISomething provideSomething() {
return new MockSomething();
}
}
我错过了什么吗?
答案 0 :(得分:21)
.plus()
是两个对象图的联合。第一个是作为扩展点提供的,右边是使用传入的模块实例隐式创建的。
overrides=true
允许模块覆盖同一对象图中提供的其他依赖项。
在扩展对象图时,覆盖将不起作用,因为它实际上不是覆盖(至少不是我们定义它的方式)。在内部,我们一直在松散地提到你描述为“阴影”的行为,这是Dagger目前在即将发布的v1.2版本中不支持的内容。