2013-08-31 4 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을 사용해야합니다. 여기서 바인딩은 전용 모듈 내에서만 유효합니다. 따라서 다른 구현 클래스를 동일한 인터페이스에 바인딩 할 수 있습니다. 그런 다음 상위 모듈에 개인 모듈을 설치할 수 있지만 명시 적으로 다른 모듈에 대해 보이게하려는 모든 바인딩을 expose()해야합니다.

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

Guice - Private Modules

은 말하게

그럼 당신은 어떤 부모 추상적 인 나 서블릿 모듈

MainModule.java

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

bind(OtherClass.class); 

OtherClass에 설치할 수 있습니다.자바

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

당신은 Named 주석을 사용하거나 매우 우아가 Annotation 바인딩 소유 만들 수 있습니다.

+0

이렇게하면 도움이됩니다. 감사! – jcampos8782