6

インジェクターの階層構造と createChildInjector() をいつどのように使用するかについての説明をネットで調べましたが、明確で簡潔な説明が見つかりません。

これが私のユースケースです:

  • 特定のコンテキスト項目を注入するために使用する基本アプリケーション モジュールがあります。このモジュールは、すべてのインジェクター インスタンスに含める必要があります。
  • データベースを検索する検索モジュールがあります
  • ElasticSearch を検索する検索モジュールがあります。このクラスのバインディングの一部は、データベース検索モジュールで提供されるバインディングをオーバーライドする必要があります。

たとえば、データベース検索モジュールに以下が含まれているとします。

bind(PlaceSearch.class).to(HibernatePlaceSearch.class);
bind(PersonSearch.class).to(HibernatePersonSearch.class);

また、ElasticSearch モジュールには以下が含まれます。

bind(PersonSearch.class).to(PersonElasticSearch.class); 

を含む別のモジュールを作成せずに、データベース検索モジュールからの PlaceSearch バインディングと ElasticSearch モジュールからの PersonSearch バインディングを含むインジェクターを作成する方法はありますか?

bind(PlaceSearch.class).to(HibernatePlaceSearch.class);
bind(PersonSearch.class).to(PersonElasticSearch.class);

? これは Modules.override() の場合ですか? createChildInjector のケースですか? お早めにどうぞ!

4

2 に答える 2

4

Modules.override()で動作していませんStage.PRODUCTION。プライベート モジュール内でのみバインディングが有効/可視である場所を使用PrivateModuleして、異なる実装クラスを同じインターフェイスにバインドできるようにする必要があります。次に、Private モジュールを親モジュールにインストールできますがexpose()、他のモジュールから見えるようにするすべてのバインドを明示的に行う必要があります。

Guice - プライベート モジュール

まあ言ってみれば:

DatabaseSearchModule.java (PrivateModule を拡張)

bind(PlaceSearch.class).annotatedWith(Names.named("dbSearch")).to(HibernatePlaceSearch.class);
bind(PersonSearch.class).to(HibernatePersonSearch.class);
expose(PlaceSearch.class).annotatedWith(Names.named("dbSearch"));

EleasticSearchModule.java (PrivateModule を拡張)

bind(PersonSearch.class).annotatedWith(Names.named("elastic")).to(PersonElasticSearch.class);
expose(PersonSearch.class).annotatedWith(Names.named("elastic"));

それでは、親の抽象モジュールまたはサーブレットモジュールにインストールできます

MainModule.java

install(new DatabaseSearchModule());
install(new EleasticSearchModule());

bind(OtherClass.class);

その他のクラス.java

@Inject @Named("elastic")
private PlaceSearch elasticSearch;
@Inject @Named("dbSearch")
private PlaceSearch dbSearch;

アノテーションを使用するNamedか、非常にエレガントな独自のバインディングAnnotationを作成できます。

于 2013-09-02T09:27:54.193 に答える