2013-08-31 13 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 मॉड्यूल से पर्सनशर्च बाध्यकारी
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 में स्थापित कर सकते हैं।जावा

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

आप Named एनोटेशन का उपयोग कर सकते हैं या आप बहुत ही सुंदर बंधन ही Annotation बना सकते हैं।

+0

इससे मदद मिलती है। धन्यवाद! – jcampos8782

संबंधित मुद्दे