2013-08-31 32 views
5

Tôi đã tìm kiếm trên mạng để có giải thích về chế độ thừa kế của bộ phun và cách/khi sử dụng createChildInjector(), nhưng tôi không thể tìm thấy lời giải thích rõ ràng và súc tích.Injector Hierarchy/Child Injector giải thích?

Đây là trường hợp sử dụng của tôi:

  • Tôi có một mô-đun ứng dụng cơ sở mà tôi sử dụng để tiêm mục bối cảnh nhất định. Mô-đun này nên được bao gồm trong mỗi trường hợp phun.
  • Tôi có một mô-đun tìm kiếm tìm kiếm cơ sở dữ liệu
  • Tôi có một mô-đun tìm kiếm tìm kiếm Tìm kiếm Đàn hồi. Một số các ràng buộc trong lớp này sẽ ghi đè lên các ràng buộc được cung cấp trong mô-đun tìm kiếm cơ sở dữ liệu.

Ví dụ, nói module tìm kiếm cơ sở dữ liệu chứa:

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

Và module ElasticSearch chứa:

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

Có cách nào để tạo ra một vòi phun bao gồm PlaceSearch ràng buộc từ mô-đun tìm kiếm cơ sở dữ liệu và ràng buộc PersonSearch từ mô-đun Tìm kiếm Đàn hồi mà không cần tạo mô-đun riêng có chứa

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

? Đây có phải là một trường hợp cho Modules.override()? Một trường hợp cho createChildInjector? Cảm ơn trước!

Trả lời

2

Đây là trường hợp hoàn hảo cho Modules.override().

Hầu hết các ứng dụng không được sử dụng kim phun trẻ em. Chúng thêm rất nhiều cấu hình phức tạp và có một số hành vi đáng ngạc nhiên cho các trường hợp góc.

+0

Cảm ơn câu trả lời. Bạn có thể cho tôi một lời giải thích về những gì chính xác một con injector là? Hoặc chỉ cho tôi một tài liệu tham khảo tốt? Tôi không chắc tôi hoàn toàn hiểu khái niệm về tiêm chích trẻ em. – jcampos8782

+0

Khái niệm tiêm trẻ được giải thích khá rõ trong câu trả lời này: http://stackoverflow.com/a/12774246/205866 – racc

4

Modules.override() không hoạt động trong Stage.PRODUCTION. Bạn nên sử dụng PrivateModule trong đó ràng buộc là hợp lệ/chỉ hiển thị bên trong mô-đun riêng tư, do đó bạn có thể liên kết các lớp triển khai khác nhau với cùng một giao diện. Sau đó, bạn có thể cài đặt mô-đun Riêng cho Mô-đun chính, nhưng bạn phải rõ ràng expose() tất cả các ràng buộc mà bạn muốn hiển thị cho các mô-đun khác.

Guice - Private Modules

phép nói rằng:

DatabaseSearchModule.java (mở rộng 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 (mở rộng PrivateModule)

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

Vậy thì bạn có thể cài đặt nó trong một số chuyên trừu tượng hoặc servlet mô-đun

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; 

Bạn có thể sử dụng Named chú thích hoặc bạn có thể tạo ra rất thanh lịch có sở hữu phần ràng buộc Annotation.

+0

Điều này giúp ích. Cảm ơn! – jcampos8782