2013-08-31 9 views
5

私は、インジェクタの階層と、どのように/ 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の場合?あらかじめありがとう!

答えて

2

Modules.override()の場合はこれが最適です。

ほとんどのアプリケーションでは、子インジェクタを使用しないでください。これらは設定の複雑さを増やし、コーナーケースに対しては驚くべき動作をします。

+0

お返事ありがとうございます。あなたは私にちょうど子供の注射器が何であるかの説明を教えてもらえますか?または私は良いリファレンスを指摘しますか?私は子供の注射器の概念を完全に理解しているかどうかはわかりません。 – jcampos8782

+0

子供のインジェクターの概念は、この回答で非常によく説明されています:http://stackoverflow.com/a/12774246/205866 – racc

4

Modules.override()Stage.PRODUCTIONで機能しません。 PrivateModuleを使用する必要があります。ここでは、バインドはプライベートモジュール内でのみ有効/表示されるため、異なるインプリメンテーションクラスを同じインターフェイスにバインドできます。プライベートモジュールを親モジュールにインストールできますが、明示的にexpose()のすべてのバインディングを他のモジュールで表示する必要があります。

Guice - Private Modules

言うことができます:

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); 

OtherClassでそれをインストールすることができます。JavaのあなたがNamed注釈を使用することができますかあなたはAnnotationを結合非常にエレガント独自に作成することができます

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

+0

これは役立ちます。ありがとう! – jcampos8782