1

クラスShinyCoinProviderRustyCoinProvider両方が実装されProvider<Coin>、それぞれがCoinわずかに異なるプロパティを持つオブジェクトを生成します。

もう 1 つの 2 つのクライアント クラスのセットにはRichPlayer、Guice ライブラリによって自動的PoorPlayerに挿入される のインスタンスが必要です。Coin

現在、クラスShinyCoinProviderRichplayerおよびクラス内で使用するには Guice が必要です。RustyCoinProviderPoorPlayer

したがって単純なので、bind().toProvider()ここでは十分ではありません。

提供されたオブジェクトが同じタイプである場合に、異なるプロバイダーを異なるクライアントクラスに明示的にバインドする方法は?

4

2 に答える 2

3

turtledoveの答えは注釈付きバインディングと呼ばれ、RichPlayer と PoorPlayer を制御できる場合は非常に理にかなっています。また、同じクラスの光沢のあるコインと錆びたコインをリクエストすることもできます。ただし、必要に応じて、プライベート モジュールを使用することもできます。

class CoinModule extends AbstractModule {
  @Override public void configure() {
    install(new PrivateModule() {
      @Override public void configure() {
        bind(Coin.class).toProvider(ShinyCoinProvider.class);
        bind(RichPlayer.class);
        expose(RichPlayer.class);
      }
    });
    install(new PrivateModule() {
      @Override public void configure() {
        bind(Coin.class).toProvider(RustyCoinProvider.class);
        bind(PoorPlayer.class);
        expose(PoorPlayer.class);
      }
    });
  }
}

基本的に、これは、それぞれが異なるプレーヤーをバインドする 2 つの匿名の内部モジュールをインストールするため、アノテーションがなくても、RichPlayerと RichPlayer の依存関係、およびその依存関係の依存関係などはすべて ShinyCoinProvider を使用します。PoorPlayer と RustyCoinProvider も同様です。これは、注釈付きのバインディングよりも従うのが少し難しいかもしれませんが、もう少し強力でもあります。おそらく、ここから、RichPlayer と PoorPlayer を減らして同じ具象クラスを使用するか、両方のプレーヤーの実装が使用する CoinPurse クラスを作成できます。単に注入しProvider<Coin>ます。

于 2012-09-29T23:13:53.663 に答える
2

これを試して:

bind(Coin.class).annotatedWith(Names.named("richplayer")).toProvider(ShinyCoinProvider.class)

次のような @Named("richplayer") を使用した Richplayer の注釈 Coin フィールド:

@Inject
@Named("richplayer")
private Coin coin;
于 2012-09-27T08:29:23.043 に答える