Я новичок в кинжале. Я создал очень простой модульный тест, чтобы попытаться понять, как мне использовать кинжал. К сожалению, это не удается. Я, наверное, не понял некоторых основных принципов кинжала.
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 содержит аннотированный метод @Provides, который создает B.
Обновлять:
Я обнаружил, что когда я пишу класс модуля, подобный этому
@Module(injects = { A.class })
public class DaggerModule {
@Provides
public B provideB() {
return new B();
}
}
инъекция B в A работает. Однако я не понимаю, почему он не работает, когда модуль имеет аннотированный метод Provides, который создает экземпляр 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.
Значит я что-то не так делаю или неправильно истолковал возможности кинжала?