2013-08-31 72 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綁定,而不創建包含

的單獨模塊3210
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,其中綁定僅在私有模塊內有效/可見,因此您可以將不同的實現類綁定到相同的接口。然後,您可以將Private模塊安裝到父模塊,但您必須明確地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")); 
然後

那麼你可以在一些家長抽象或servlet模塊

MainModule.java

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

bind(OtherClass.class); 

OtherClass安裝。java的

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

您可以使用Named註釋,或者您可以創建非常優雅的自己的綁定Annotation

+0

這有助於。謝謝! – jcampos8782