我是匕首新手。我创建了一个非常简单的单元测试来尝试了解我应该如何使用匕首。不幸的是它失败了。我可能还没有理解匕首的一些基本原理。
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 来避免的那种开销。
所以我做错了什么还是我误解了匕首的功能?