Guiceをレビューしています。次の設定があるとします。
public interface IsEmailer {...}
public interface IsSpellChecker {...}
public class Emailer implements IsEmailer {
@Inject
public class Emailer(final IsSpellChecker spellChecker)....
}
public class FrenchSpellChecker implements IsSpellChecker {....}
public class EnglishSpellChecker implements IsSpellChecker {....}
@BindingAnnotation public @interface English {}
@BindingAnnotation public @interface French {}
次に、私のモジュールで、インターフェイスをそれぞれの実装にバインドし、それぞれのバインディング アノテーションでスペル チェッカーにアノテーションを付けました。
ここで、ランタイム変数に基づいて、英語またはフランス語のスペル チェッカーを使用する電子メール プログラムを作成する必要があるとします。
モジュールで名前付きプロバイダーを使用することを考えました:
@Provides
@English
IsEmailer provideEnglishEmailer() {
return new Emailer(new EnglishSpellChecker());
}
@Provides
@French
IsEmailer provideFrenchEmailer() {
return new Emailer(new FrenchSpellChecker());
}
これは次のように機能します。
IsEmailer emailer = myModule.getInstance(Key.get(IsEmailer.class,
French.class));
これは、このようなことを行う最もクリーンな方法ですか? 結局のところ、(プロバイダーで) 手でオブジェクトを作成する必要があります。
ありがとう