我是匕首的新手。我创建了一个非常简单的单元测试来试图理解我应该如何使用匕首。不幸的是失败了。我可能不了解匕首的一些基本原则。
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中使用构造函数或setter来接受B只是我认为可以通过使用Dagger避免的开销。
所以我做错了什么或者我误解了匕首的能力?
答案 0 :(得分:1)
我注意到完全相同的行为,即@Provides生成的实例没有注入其@Inject标记成员。 cf Dagger & nested injections
我和你完全一样:使用@Provides参数注入转发给构造函数(没有同样的印象,它有点击败dagger的目的)。我会尝试更多地潜入匕首,以便在我有空闲的时候尽快找出这是否是正常的行为。
答案 1 :(得分:0)
如果您使A级成为模块的入口点而不是匕首将依赖性B注入A.
@Module(entryPoints = { A.class })
public class DaggerModule {
@Provides
public A provideA() {
return new A();
}
@Provides
public B provideB() {
return new B();
}
}