私は短剣が初めてです。短剣の使用方法を理解するために、非常に単純な単体テストを作成しました。残念ながら失敗します。私は短剣の基本原理を理解していないかもしれません。
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());
}
}
A は B を注入することを望んでおり、DaggerModule には B を作成する @Provides アノテーション付きメソッドが含まれているため、短剣は B を A に注入すると考えました。
アップデート:
このようにモジュールクラスを書くと、
@Module(injects = { A.class })
public class DaggerModule {
@Provides
public B provideB() {
return new B();
}
}
AへのBの注入は機能します。ただし、モジュールにAのインスタンスを構築するProvidesアノテーション付きメソッドがある場合に機能しない理由がわかりません。その場合、インジェクションを機能させる唯一の方法は、実際にインジェクションを自分で次のように記述することです。
@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();
}
}
または、Bを受け入れるコンストラクターをAに作成して、次のように記述できるようにします
@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();
}
}
B を受け入れるコンストラクターまたはセッターを A に持つ必要性は、Dagger を使用することで回避できると私が考えた種類のオーバーヘッドでした。
だから私は何か間違ったことをしているのですか、それとも短剣の機能を誤解しましたか?