1

2つのクラスがあるとします。

class A { ... }
class B {
 public B(A a) {...}
}

名前を取得し、注釈付きBのバインディングを作成する必要があるモジュールを作成したい:

class MyModule extends AbstractModule {
  String name;
  public MyModule(String name) { this.name = name; }

  public void configure() {
    // CREATE BINDING for @Named(name)B which depends on @Named(name)A
  }
}

正しいAに依存するB(またはそのプロバイダー)のバインディングを作成するための最良の方法は何でしょうか?

ありがとうヤロン

4

2 に答える 2

0

今週、別の SO スレッドで非常によく似た質問に答えました。

サポートする注釈がわかっている場合は、 for each 注釈を作成して、A をバインドする必要がある場所でのみ使用するPrivateModuleように を公開できます。@Named("c1") B@Named("c1") A

install(new PrivateModule() {
  @Override void configure() {
    // These are only bound within this module, and are not visible outside.
    bind(A.class).to(A1.class);
    // Though you can bind to other bindings which come from outside!
    bind(B.class).to(Key.get(B.class, Names.named("c1")));
    // Now expose the annotated bindings you'd like to expose.
    bind(C.class).annotatedWith(Names.named("c1")).to(C.class);
    expose(C.class).annotatedWith(Names.named("c1"));
  }
});

Guice は (Annotation, TypeLiteral) タプルからプロバイダーへのファンシー マップとして構築されているため、「すべてのアノテーション N について、 を@N B使用できるようにする」と言う方法はないと思います。@N Aまたは、依存関係グラフのずっと下に存在しない可能性があります。

于 2012-12-26T21:21:06.573 に答える
0

これはどう:

bind(B.class).annotatedWith(Names.named("name")).toProvider( new Provider<B>() {

    private A namedA;

    @Inject
    public void setNamedA(@Named("name") A namedA ) {
        this.namedA = namedA;
    }      

    @Override
    public B get() {
        return new B( namedA );
    }

} );

テストしていませんが、ドキュメントに従って動作するはずです。

于 2012-12-26T10:43:42.277 に答える