1

クラスAをGINでどこかに注入したい。A クラス コンストラクターには、実行時に認識される ID と、他の 2 つのクラス B および C が必要です。B および C コンストラクターには、パラメーターとして A の同じ ID が必要です。

クラスの例です。

public class A {
   @Inject
   public A(String id, B b, C c)
   {
    ...
   }
}

public class B {
   @Inject
   public B(String id)
   {
    ...
   }
}

public class C {
   @Inject
   public C(String id)
   {
    ...
   }
}

Aインジェクション中にIDをすべてのクラスに伝播するにはどうすればよいですか?

1 つの解決策は、3 つのクラスすべての作成メソッドで AssistedInjectionFactory を使用することですが、これには、ファクトリを使用して B と C をインスタンス化するために、A コンストラクターを変更する必要があります。

GIN を使用して A コンストラクターのボイラープレート コードを回避する他の方法はありますか?

4

1 に答える 1

3

私は@Named注釈を使用し、id 値を計算する方法に応じて、bindConstantメソッドまたはProvider:

...
@Inject public A(@Named("myId") String id, B b, C c)
...
@Inject public B(@Named("myId") String id)
...
@Inject public C(@Named("myId") String id)


public class MyModule extends AbstractGinModule {

  protected void configure() {
    // You can use bindConstant and compute the id in configure()
    String myid = "foo_" + System.currentTimeMillis();
    bindConstant().annotatedWith(Names.named("myId")).to(myId)
  }

  // Or you can use a provider to compute your Id someway 
  @Provides @Named("myId") public String getMyId() {
    return "bar_" + System.currentTimeMillis();
  }      

}
于 2013-10-01T07:21:32.737 に答える