のは、私はその後、私のアプリケーションで使用できるコンポーネントの多くを結合しThirPartyModule
サードパーティ製のモジュールを持っているとしましょう:Guice:サードパーティ製モジュールのバインディングをカスタマイズする方法は?
Injector guice = Guice.createInjector(new MyAppModule(), new ThirPartyModule());
私はそのモジュールにいくつかのバインディングに使用する実装クラスを変更したい場合は、どのような最善のアプローチですか?
たとえば、のは、結合ThirPartyModule
行いをしましょう:
bind(WidgetInterface.class).to(DefaultWidgeImpl.class).in(Scopes.SINGLETON);
と私はMyWidgetImpl
クラスのDefaultWidgeImpl
クラスを変更できるようにしたいです。私は、オーバーライドするモジュールを使用することができ、単にWidgetInterface
キーを再バインドすることができます。しかし、どうすればThirPartyModule
がバインドするかたくさんその同じウィジェットの実装?私は彼らのそれぞれを再バインドする必要はありません!
私はそれに応じてすべてのコンポーネントを再バインドせずに、使用する実装クラスを指定できる最適なソリューションを見つけようとしています。
bind(WidgetInterface.class).to(getWidgetImpClass()).in(Scopes.SINGLETON);
protected Class<? extends WidgetInterface> getWidgetImpClass() {
return DefaultWidgeImpl.class;
}
し、アプリケーションがgetWidgetImpClass()
メソッドオーバーライドすることができます::
私はThirPartyModule
が最初にゲッター実装クラスのメソッド作成することができます推測
Injector guice = Guice.createInjector(new MyAppModule(), new ThirPartyModule() {
@Override
protected Class<? extends WidgetInterface> getWidgetImpClass() {
return MyWidgetImpl.class;
}
});
を私にもかかわらず、実装クラスを渡すことについてモジュールのコンストラクタに:
Injector guice = Guice.createInjector(new MyAppModule(), new ThirPartyModule(MyWidgetImpl.class));
このようなサードパーティのモジュールをカスタマイズするための受け入れられたパターンがあるかどうかを知りたいですか? がの場合、モジュールをカスタマイズできるようにするには、モジュールを特定の方法で記述するように頼むことができます。ここで
うわー、私は「オプションバインダー」も知らなかったことを認めなければなりません。本当に便利です...ありがとう! – electrotype
シングルトンは '@Named(" default ")'とは関係がありません。 'CustomWidgetImpl'がシングルトンでなければならない場合、それを' @Singleton'でマークするか '.in(Singleton.class)'で行います。 –
それにもかかわらず、あなたはおそらく '@Named(" default ")'なしで行うことができます。 '{CoolWidget、AwesomeWidget} - > WidgetInterface - > DefaultWidgetImpl'のようになります。 –