0

我是匕首新手。我创建了一个非常简单的单元测试来尝试了解我应该如何使用匕首。不幸的是它失败了。我可能还没有理解匕首的一些基本原理。

public class A {
    @Inject
    public B b;

    public B getB() {
      return b;
    }
}

public class B {
}

@Module(injects = { A.class, B.class })
public class DaggerModule {
    @Provides
    public A provideA() {
        return new A();
    }

    @Provides
    public B provideB() {
         return new B();
    }
}

和我失败的测试课

public class DaggerTest extends TestCase {
    public void testDagger() {
        ObjectGraph theGraph = ObjectGraph.create(new DaggerModule());
        A theA = theGraph.get(A.class);
        assertNotNull(theA.getB());
    }
}

我认为匕首会将 B 注入到 A 中,因为 A 希望将其注入,而 DaggerModule 包含一个创建 B 的 @Provides 注释方法。

更新:

我发现当我这样写模块类时

@Module(injects = { A.class })
public class DaggerModule {
    @Provides
    public B provideB() {
        return new B();
    }
}

将 B 注入 A 有效。但是我不明白为什么当模块有一个提供注释的方法时它不工作,该方法构造了一个 A 的实例。在这种情况下,让注入工作的唯一方法是自己实际编写注入,如下所示:

@Module(injects = { A.class, B.class })
public class DaggerModule {
    @Provides
    public A provideA(B b) {
        A theA =  new A();
        theA.b = b;
        return theA;
    }

    @Provides
    public B provideB() {
         return new B();
    }
}

或在 A 中创建一个接受 B 的构造函数,以便您可以编写

@Module(injects = { A.class, B.class })
public class DaggerModule {
    @Provides
    public A provideA(B b) {
        return new A(b);
    }

    @Provides
    public B provideB() {
         return new B();
    }
}

在 A 中需要一个接受 B 的构造函数或设置器,这正是我认为可以通过使用 Dagger 来避免的那种开销。

所以我做错了什么还是我误解了匕首的功能?

4

2 回答 2

1

我注意到完全相同的行为,即@Provides 生成的实例没有注入其@Inject 标记的成员。cf Dagger 和嵌套注入

我和你做的完全一样:使用@Provides 参数注入转发给构造函数(没有同样的印象,它有点违背匕首的目的)。一旦我有空闲时间,我会尝试更多地研究匕首,以确定这是否是正常行为。

于 2013-07-25T11:10:21.477 回答
0

如果您将 A 类作为模块的入口点,那么 dagger 会将依赖项 B 注入 A。

@Module(entryPoints = { A.class })
public class DaggerModule {
    @Provides
    public A provideA() {
        return new A();
    }

    @Provides
    public B provideB() {
         return new B();
    }
}
于 2013-05-12T04:33:24.740 回答