2009-06-24 8 views
7

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

public class FooBarClass { 
    public FooBarClass(String name, String anotherOne) { 
     // Some stuff 
    } 
} 

मामलों में जहां मैं में संदेह Guice या अधिक सामान्य रूप डि सही तरीके से उपयोग करने के लिए कैसे कर रहा हूँ रहे हैं। "अक्सर मैं सुनता हूं: एक्सवाईजेड फ्रेमवर्क नया नया है।" लेकिन यह निहित है कि मुझे DI12 फ्रेमवर्क के साथ प्रत्येक उदाहरण बनाना है।

केवल एक आवृत्ति

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

कई उदाहरणों के लिए आवश्यक हैं

एक ही बात एक मामले में जहां मैं इस वर्ग के कई उदाहरण की जरूरत है पर लागू होता है। कोई निर्भरता नहीं है, लेकिन मुझे इससे कुछ भी प्राप्त करने के लिए बॉयलरप्लेट कोड का एक गुच्छा बनाना है। यह मेरे लिए गलत लगता है।

तो, मुझे DI और/या Guice का उपयोग कैसे करना चाहिए?

बहुत बहुत धन्यवाद!

उत्तर

23

निर्भरताडेटा से विभाजित करने में मदद कर सकता है।

  • निर्भरता अक्सर सेवाएं होती हैं: डेटाबेस, घड़ियां, और आरपीसी स्टब्स। इसके अलावा इन सभी पर लागू आवेदन कोड: UserAuthenticator, PaymentHandler, और EmailGateway
  • डेटा केवल यही है: Date, Map<String,InetAddress> या यहां तक ​​कि Customer। ये सरल, इन-मेमोरी डोमेन ऑब्जेक्ट्स हैं।

DI स्वाभाविक रूप से चीजों की निर्भरता पक्ष के लिए उपयुक्त है। आपको अपने डेटा मॉडल कक्षाओं के लिए new का उपयोग करना जारी रखना चाहिए।

2

यदि आप अलग-अलग ग्राहकों जैसे कई उदाहरण बना रहे हैं, तो उन्हें इंजेक्ट करने का कोई अर्थ नहीं है। एक ग्राहक फैक्ट्री बनाने का अर्थ क्या है जो @ सिंगलेटन स्कोप हो सकता है जो ग्राहक की सभी निर्भरताओं के साथ ग्राहक उदाहरण बना सकता है।

2

एक निर्भरता इंजेक्ट करें यदि आप किसी विशेष वर्ग का परीक्षण करते समय इसकी जटिलता को अनदेखा करना चाहते हैं। यदि कक्षा सिर्फ एक डेटा धारक है, तो इसका कोड छोटा है (प्राप्त करें, सेट करें, बराबर)। लक्ष्य वर्ग का परीक्षण करते समय आपको इसे नकल करने की आवश्यकता नहीं है, इसलिए डेटा आवृत्ति इंजेक्शन करना अधिक है (और आमतौर पर कठिन)।यदि कोड छोटा नहीं है, तो कक्षा डेटा धारक से अधिक है, और आपको इसे इंजेक्शन और यूनिट परीक्षणों पर नकल करना चाहिए।

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

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