複数の実装を持つGuiceとインターフェース 質問する

複数の実装を持つGuiceとインターフェース 質問する

Validator インターフェイスと、このインターフェイスの複数の実装がある場合、Guice を使用して複数の実装のいずれかを注入するにはどうすればよいでしょうか。現在、次のコードを使用して 1 つを注入できることはわかっていますが、実装は 1 つしか許可されません。

public class MyModule extends AbstractModule {
  @Override 
  protected void configure() {
    bind(Validator.class).to(OneOfMyValidators.class);
  }
}

私がやりたいことは次のとおりです。

Validator v1 = injector.getInstance(Validator1.class);
Validator v2 = injector.getInstance(Validator2.class);

それは本当に可能ですか?

ベストアンサー1

簡単に答えると、バインディング アノテーションです。基本的には、完全な具体的な実装クラスへの依存を必要とせずに、依存元が特定のインスタンスまたは実装を指すヒントを提供できるようにする方法です。

見る:https://github.com/google/guice/wiki/BindingAnnotations

たとえば、モジュールでは次のように実行します。

bind(Validator.class).annotatedWith(ValidatorOne.class).to(OneOfMyValidators.class);
bind(Validator.class).annotatedWith(ValidatorTwo.class).to(SomeOtherValidator.class);

コンストラクターでは、次のようにします。

@Inject
MyClass(@ValidatorOne Validator someValidator,
    @ValidatorTwo Validator otherValidator) {
  ...
}

から直接注釈付きの値を取得するにはInjector、次のように GuiceKeyクラスを使用する必要があります。

Validator v1 = injector.getInstance(Key.get(Validator.class, ValidatorOne.class));

ちなみに、バインディング アノテーションはランタイム定数を挿入するのに非常に便利です。次のコメントを参照してくださいbindConstant

https://google.github.io/guice/api-docs/latest/javadoc/index.html?com/google/inject/Binder.html

おすすめ記事