2010-07-16 20 views
10

के साथ पकड़ने के लिए मैं Google Guice के साथ एक निर्भरता इंजेक्शन ढांचे के रूप में खेलना शुरू कर रहा हूं और हाल ही में लिखे गए एक छोटे से मध्यम आकार के प्रोजेक्ट में इसे फिर से निकालने का प्रयास कर रहा हूं। मैं समझता हूं कि गुइस कैसे काम करता है, लेकिन कुछ दृष्टिकोण विवरणों पर थोड़ा अस्पष्ट हूं। उदाहरण के लिए:Google Guice

1) मॉड्यूल का उपयोग आपके बाइंडिंग को परिभाषित करने के लिए किया जाता है, जिसे इंजेक्टर में खिलाया जाता है। क्या आप सब कुछ एक मॉड्यूल में डालते हैं या क्या आप चीजों को बहुत छोटे मॉड्यूल में तोड़ते हैं?

2) क्या आपके पास शीर्ष स्तर पर एक इंजेक्टर है जो पूरे ऑब्जेक्ट पेड़ या एकाधिक इंजेक्टरों को इंजेक्ट करता है जिसके बारे में केवल उन निर्भरताओं को इंजेक्ट करता है जिन्हें आपको वास्तव में इंजेक्ट करने की आवश्यकता होती है? मैं अपने स्वयं के कोड बेस के बारे में सोच रहा हूं, बेशक, इसमें कई निर्भरताएं हैं, लेकिन केवल एक छोटा सा मुट्ठी भर जिसे मुझे परीक्षण के दौरान नियंत्रित करने की आवश्यकता है।

3) मैं उत्पादन प्रणाली के बजाय परीक्षण-पर्यावरण-केवल मॉड्यूल का उपयोग करके अपने सिस्टम/एकीकरण परीक्षणों को प्राप्त करने के सर्वोत्तम तरीके से थोड़ा फंस गया हूं। यह प्रश्न संभवतः कार्यान्वयन विशिष्ट है, लेकिन मैं उत्सुक हूं कि लोग किस तरीके का उपयोग करते हैं। संदर्भ के लिए, मेरा ऐप एक सर्वलेट आधारित वेब ऐप है।

कोई अन्य पॉइंटर्स?

उत्तर

13

1) आम तौर पर आप चीजों को कई मॉड्यूल में तोड़ देंगे। गुइस के लक्ष्यों में से एक कोड मॉड्यूलर बनाने में मदद करना है, और यही मॉड्यूल के लिए है। आप इसे कैसे तोड़ते हैं आप पर निर्भर करता है (और जाहिर है, आपको बिल्कुल नहीं करना है)। बेहतर अनाज वाले मॉड्यूल का एक लाभ यह है कि आप किसी विशेष पैकेज के भीतर मॉड्यूल को परिभाषित कर सकते हैं और कक्षाओं को इंटरफेस पैकेज-प्राइवेट को कार्यान्वित कर सकते हैं। चूंकि मॉड्यूल पैकेज में है, इसलिए यह उन ठोस कक्षाओं को बांध सकता है और उनका उपयोग Injector (किसी अन्य पैकेज में) को कॉन्फ़िगर करने के लिए किया जा सकता है। इसके अतिरिक्त, आप अपने कोड को अधिक लचीला बनाते हैं जब आप एक एकल मोनोलिथिक मॉड्यूल में कोड बदलने के बजाए, किसी दूसरे के लिए एक मॉड्यूल को बदलकर कुछ कैसे किया जाता है, यह बदल सकते हैं।

2) हां, पूरे ऑब्जेक्ट पेड़ को इंजेक्शन देने वाले शीर्ष स्तर पर एक इंजेक्टर जिस तरह से चीजों को आम तौर पर किया जाना चाहिए। यह मॉड्यूल चीज पर वापस आता है ... समूहों में निर्भरता को तोड़ने और एक इंजेक्टर का उपयोग करने के लिए उनका उपयोग करें।

3) इंजेक्टर को कॉन्फ़िगर करने वाली एक अलग प्रविष्टि-बिंदु कक्षा का उपयोग करें। एक स्टैंडअलोन ऐप के लिए, मेरे पास एक वेबपैप के लिए एक अलग main कक्षा होगी ... मुझे लगता है कि आप परीक्षण के लिए अलग GuiceServletContextListener बना सकते हैं। फिर आप परीक्षण के लिए मॉड्यूल के साथ पूरे मॉड्यूल को प्रतिस्थापित कर सकते हैं, या किसी विशिष्ट मॉड्यूल में बाध्यकारी ओवरराइड करने के लिए Modules.override का उपयोग कर सकते हैं।

+0

आह, मुझे लगता है कि अब मैं अंतर देखना शुरू कर रहा हूं। मैं तुम्हारी एक और पोस्ट में ठोकर खाई जो मेरे भ्रम पर प्रकाश डाला। अनिवार्य रूप से, आपके कोड में एकाधिक इंजेक्टर निर्भरता इंजेक्शन की बजाय सेवा लोकेटर पैटर्न के समान हैं। मेरे लिए पकड़ने के लिए अभी भी और भी कुछ है, लेकिन आपके उत्तर के लिए धन्यवाद, क्योंकि यह मुझे वास्तव में अच्छी शुरुआत देता है। –

0

Dependency Injection पुस्तक पर एक नज़र डालें - इसमें गुइस और स्प्रिंग दोनों शामिल हैं, इसलिए एक ढांचे से दूसरी तरफ संक्रमण बहुत आसान है। निश्चित रूप से अच्छा अगर आप पहले से ही आईओसी के पीछे सिद्धांतों को समझते हैं।

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