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());
    }
}

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 を使用することで回避できると私が考えた種類のオーバーヘッドでした。

だから私は何か間違ったことをしているのですか、それとも短剣の機能を誤解しましたか?

4

2 に答える 2

1

まったく同じ動作に気付きました。つまり、@Provides によって生成されたインスタンスは、@Inject マークの付いたメンバーが注入されません。cfダガーと入れ子になった注射

私はあなたとまったく同じことをしました: @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 に答える