0

インターフェイスがあります: InterfaceA

クラスがあります: ConcreteA

@AnnotA@AnnotBという 2 つの注釈もあります。

私は次のバインディングを行いました:

bind(InterfaceA).annotatedWith(AnnotA).to(ConcreteA);
bind(InterfaceA).annotatedWith(AnnotB).to(ConcreteA);

次に、クラス ConcreteA には、 hostNameStringという引数を取るコンストラクターがあります。

class ConcreteA
{
    @Inject
    public ConcreteA(@Named("hostName") hostName) {
    }

    ... <rest of class>
}

以下を記述するコードが必要です。

ConcretaA が @AnnotA を使用している場合、hostName を 'localhost' の文字列値でバインドします

ConcreteA が @AnnotB を使用している場合、hostName を「externalhost」の文字列値でバインドします

これに対する解決策のアイデアはありますか?

4

2 に答える 2

1

あなたの場合、各バインディングを独自のプライベートモジュールに入れることを検討するかもしれません。

class MyModule() { 
  install(new PrivateModule() {
    public void configure() {
       bind(InterfaceA).to(ConcreteA);
       bind(String.class).annotatedWith(Names.named("hostName").to("localhost");
       expose(InterfaceA).annotatedWith(AnnotA.class);
    }});
  install(new PrivateModule() {
    public void configure() {
       bind(InterfaceA).to(ConcreteB);
       bind(String.class).annotatedWith(Names.named("hostName").to("externalhost");
       expose(InterfaceA).annotatedWith(AnnotB.class);
    }});
}

(これは記憶によるものであり、構文は 100% 正しいとは限りません。)

詳細については、Guice FAQから始めて、そのページで「ロボットの脚」を検索してください -- 冗談ではありません :)

FAQ のそのセクションからの 2 つの追加リンクの背後には、さらに詳細な情報があります。

于 2011-10-06T03:24:53.187 に答える
0

以下は、ロボットの 2 本足の問題を解決するための完全なコード リストの例です。

http://pastie.org/368348

于 2011-10-06T07:49:11.697 に答える