16

我现在正在玩 Dagger,显然有些功能不适合我。

我实际上是在尝试ObjectGraph.plus()使用模拟模块来扩展我的 ObjectGraph(通过),该模块覆盖了已经创建的图中的真实模块之一。但显然我的模拟模块被忽略了,所以调用了真正的接口。

但是,如果我尝试在图形创建阶段提供我的模拟模块 - 一切正常..

在我的情况下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();
    }
}

我错过了什么吗?

4

1 回答 1

21

.plus()是两个对象图的并集。第一个作为扩展点提供,而权限是使用传入的模块实例隐式创建的。

overrides=true允许模块覆盖同一对象图中提供的其他依赖项。

扩展对象图时,覆盖将不起作用,因为它实际上不是覆盖(至少不是我们定义它的方式)。在内部,我们一直将您描述为“阴影”的行为松散地称为“阴影”,这是 Dagger 目前在即将发布的 v1.2 版本中不支持的行为。

于 2013-11-20T01:22:18.333 回答