1

plus'ed グラフがある場合、dagger で injects 属性 (アノテーションではない) を設定するのに適切な場所はどれか疑問があります。

次のシナリオがあります。

@Module(injects = ClassWithInjects.class, complete = false)
public final class BaseModule {

  @Provides
  DependencyA providesA() { return new A(); }
  @Provides
  DependencyB providesB() { return new B(); }
  ...
}

class ClassWithInjects {
  @Inject
  A a;
  @Inject
  B b;
}

それはうまくいきました:

ObjectGraph graph = ObjectGraph.create(new BaseModule()).plus(new Object[0]); // no modules used to plus by default
graph.inject(new ClassWithInjects());

その後、その時点から B を提供する唯一のモジュールである新しいモジュールを追加しました。

@Module(injects = ClassWithInjects.class, complete = false)
public final class BaseModule {

  @Provides
  DependencyA providesA() { return new A(); }
  ...
}

@Module(addsTo = BaseModule.class, complete = false)
public final class AdditionalModule {
  @Provides
  DependencyB providesB() { return new B(); }
}

class ClassWithInjects {
  @Inject
  A a;
  @Inject
  B b;
}

それは失敗しています

IllegalStateException クラス ClassWithInjects で必要な B のバインディングはありません

これを行うとき:

ObjectGraph graph = ObjectGraph.create(new BaseModule()).plus(new AdditionalModule());
graph.inject(new ClassWithInjects());

移動すると動作します

injects = ClassWithInjects.class

BaseModule から AdditionalModule への属性。

では、plus'ed モジュールを使用する場合、injects 属性をどこに配置すればよいのでしょうか? .plus(...) の呼び出しでパラメーターとして使用されるモジュールの 1 つにある必要がありますか?

このgithubの問題によると、依存関係を注入しようとするインスタンスのバインディングを持つモジュールにインジェクトを配置する必要があります(上記の例ではClassWithInjects)が、すべてを満たすために必要な異なるバインディングを提供する複数のモジュールがある場合はどうなりますかそのインスタンスの依存関係? 他のすべてを含むモジュールを作成し、そこに injects 属性を配置する必要がありますか?

4

1 に答える 1