हमें निर्भरता इंजेक्शन के लिए रूपरेखा की आवश्यकता क्यों है? [बन्द है]


42

मैं इसे लागू करने के रूप में नियंत्रण सिद्धांत और निर्भरता इंजेक्शन के व्युत्क्रम पर अधिक पढ़ रहा हूं और मुझे यकीन है कि मैं इसे समझता हूं।

ऐसा लगता है कि मूल रूप से कहा जा रहा है कि 'अपने वर्ग के सदस्यों को' वर्ग के भीतर तात्कालिकता की घोषणा न करें '। बल्कि इंस्टेंटिसेस को कंस्ट्रक्टर के माध्यम से पास और सौंपा जाना चाहिए; बाहर के स्रोत से कक्षा में 'इंजेक्ट'।

यदि यह सरल है, जो यह प्रतीत होता है, तो हमें एनोटेशन के साथ इसे लागू करने वाले स्प्रिंग या गाइस जैसे ढांचे की आवश्यकता क्यों है? क्या मुझे यहाँ कुछ मौलिक याद आ रही है? मैं वास्तव में यह समझने के लिए संघर्ष कर रहा हूं कि डिपेंडेंसी इंजेक्शन फ्रेमवर्क का उपयोग क्या है।

संपादित करें: संभावित डुप्लिकेट के बारे में, मेरा मानना ​​है कि मेरा प्रश्न अधिक अनूठा है क्योंकि यह डीआई के ढांचे के बारे में पूछ रहा है, न कि बसंत। स्प्रिंग सिर्फ एक डीआई फ्रेमवर्क नहीं है, इसलिए कई कारण हैं कि कोई ऐसे स्प्रिंग का उपयोग करना चाहेगा जो डीआई से संबंधित नहीं है।



11
वे संकलित समय के बजाय रनटाइम में त्रुटियों को स्थानांतरित करने के लिए उपयोगी हैं।
डेन

1
@ हम ऐसा क्यों करना चाहेंगे? ऐसा लगता है कि तेजी से उल्लंघन करने में विफल रहा है
इस उपयोगकर्ता की मदद

जवाबों:


26

हमें रूपरेखा की आवश्यकता नहीं है। अपेक्षाकृत बड़ी परियोजना के लिए भी, मैन्युअल रूप से निर्भरता इंजेक्शन को लागू करना पूरी तरह से संभव है।

दूसरी ओर, एक रूपरेखा का उपयोग करना आसान बनाता है, विशेष रूप से एनोटेशन या निर्भरता के स्वत: पता लगाने के आधार पर, क्योंकि यह प्रक्रिया को सरल बनाता है: अगर मैं तय करता हूं कि मुझे एक कक्षा में एक नई निर्भरता की आवश्यकता है, तो मुझे बस इतना जोड़ना होगा। यह कंस्ट्रक्टर (या एक सेटर घोषित करने के लिए) और ऑब्जेक्ट को इंजेक्ट किया जाता है - मुझे किसी भी तात्कालिक कोड को बदलने की आवश्यकता नहीं है।

इसके अलावा, फ्रेमवर्क में अक्सर अन्य उपयोगी कार्यक्षमता होती है। उदाहरण के लिए, वसंत में पहलू उन्मुख प्रोग्रामिंग के लिए एक उपयोगी रूपरेखा शामिल है, जिसमें घोषणात्मक लेन-देन सीमांकन (जो कि बहुत आसान है) और कई प्रकार के एडेप्टर कार्यान्वयन शामिल हैं जो कई 3 पार्टी पुस्तकालयों को एकीकृत करना आसान बनाते हैं।


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

1
सही कहा। और पहिया को फिर से क्यों मजबूत करें जब किसी और ने पहले से ही अच्छा और गोल बना दिया हो?
22:17

ठीक है कि। सिवाय मुझे किसी भी तात्कालिकता कोड को बदलने की आवश्यकता नहीं है - बेशक, कोई तात्कालिकता कोड नहीं है ;-)
मैथ्यू गुइंडन

यह सिर्फ अपने DI पुस्तकालयों चूसना की तरह लग रहा है। प्रतिबिंब का उपयोग करके अच्छे लोग वर्ग का अनुमान लगा सकते हैं।
फ्लोरियन मार्गाइन

2
रनटाइम प्रोसेसिंग के लिए प्रतिबिंब का उपयोग करने वाला कोई भी व्यक्ति गलत कर रहा है। प्रतिबिंब उन प्रौद्योगिकियों में से एक है, जो सिर्फ इसलिए कि आप कुछ कर सकते हैं इसका मतलब यह नहीं है कि आपको चाहिए।
gbjbaanb

12
  1. हमें DI (डिपेंडेंसी इंजेक्शन) की आवश्यकता क्यों है?

    DI तंत्र वस्तु के उपभोग से वस्तु उत्पादन को अलग करता है। आश्रितों को एक वस्तु की जरूरत पारदर्शी रूप से बाहर से पहुंचाई जाती है। तंत्र का लाभ स्पष्ट है: आप किसी भी समय निर्भरता की अदला-बदली कर सकते हैं, उदाहरण के लिए परीक्षण उद्देश्यों के लिए अशक्त वस्तु

  2. यह कैसे किया जाता है?

    लक्ष्य प्राप्त करने के कई तरीके हैं:

    • कंस्ट्रक्टर इंजेक्शन के माध्यम से निर्भरता इंजेक्षन
    • गेट्टर / सेटर के माध्यम से इंजेक्शन
    • इंटरफ़ेस इंजेक्शन
  3. क्या हमें DI चौखटे चाहिए?

    नहीं बिलकुल नहीं। आप बस अन्य वस्तुओं को मैन्युअल रूप से सभी उदाहरणों को पास कर सकते हैं। यदि आपके पास एक छोटा अनुप्रयोग है, तो वसंत कंटेनर की कोई आवश्यकता नहीं है।

    लेकिन दूसरी तरफ, फ्रेमवर्क आपको वस्तुओं को प्रबंधित करने में मदद करते हैं:

    • वे जटिल वस्तु संबंधों को तार-तार करने में आपकी मदद करते हैं। आपको कोई बॉयलरप्लेट कोड नहीं लिखना होगा, उदाहरणों को उत्पन्न करने के लिए और उन्हें उपयुक्त वस्तुओं को पास करना होगा

    • जब कोई ऑब्जेक्ट बनाया जाता है तो वे आपको नियंत्रित करने में मदद करते हैं : आप एप्लिकेशन बूटस्ट्रैपिंग के दौरान उदाहरण बना सकते हैं, लेकिन कुछ मामलों में एक आलसी निर्माण - केवल जब आवश्यक हो - बेहतर है

    • वे आपको नियंत्रित करने में मदद करते हैं कि कितने उदाहरण बनाए जाते हैं: एक आवेदन जीवन भर या एक प्रति अनुरोध (यदि आप वेब-प्रोग्रामिंग कर रहे हैं तो)

यदि आपके पास उचित आकार का प्रोजेक्ट है - यदि आपको कम बॉयलरप्लेट कोड लिखने की आवश्यकता महसूस होती है - तो यह पूरी तरह से एक (DI-) फ्रेमवर्क का उपयोग करके समझ में आता है। विपक्ष की तुलना में अधिक पेशेवरों हैं।


2
आप बिना किसी फ्रेमवर्क का उपयोग किए DI DI पुस्तकालयों का उपयोग कर सकते हैं।
फ्लोरियन मार्गाइन

5

वसंत के साथ, यह ज्यादातर सुविधा की बात है।

यदि आपके पास वह क्लास है TopLevelजो कंस्ट्रक्शंस क्लास है MiddleLevelजो क्लास का निर्माण करता है LowLevel, और आपको एहसास होता है कि आपको एक नए कंस्ट्रक्टर पैरामीटर की आवश्यकता है LowLevel, तो आपको इसे भी जोड़ना होगा TopLevel, और MiddleLevelबस इतना है कि जब यह MiddleLevelनिर्माण करने का समय हो तो एक LowLevelमूल्य उपलब्ध होगा ताकि इसके निर्माणकर्ता को पास किया जा सके। वसंत के साथ, आप सिर्फ एक एनोटेशन जोड़ते हैं।

इसके अलावा, वसंत के साथ, एक्सएमएल के बजाय बाहरी कॉन्फ़िगरेशन फ़ाइल में निर्भरता को परिभाषित करना संभव है, और यह आपको "किसी भी कोड को बदलने के बिना" पूरी तरह से अलग तारों के साथ एक नई प्रणाली उत्पन्न करने की क्षमता देता है। (IMHO यह पूरी तरह से गलत है, क्योंकि xml को बदलना कोड को बदलने से बहुत अलग नहीं है, और वास्तव में, कोड में आमतौर पर xml की तुलना में कहीं बेहतर त्रुटि की जाँच और प्रकार की जाँच होती है।)

एक और बात यह है कि कई लोग निर्माणकर्ताओं से डरते हैं; वे उन्हें नहीं समझते, वे उन्हें पसंद नहीं करते, वे उनका उपयोग नहीं करते।


3
ज्यादातर सहमत हैं, खासकर एक्सएमएल टिप्पणी के साथ। IMHO, निर्माणकर्ताओं से डरना संभवत: DI ढांचे का उपयोग करने का एक बुरा कारण है।
रॉबर्ट हार्वे

2
IMHO, रचनाकारों से डरना प्रोग्रामिंग से दूर रहने का एक अच्छा कारण है। C -: =
माइक नाकिस

5
लेकिन यह एक कारखाने (स्थिर या अन्यथा) पर एक फायदा कैसे है? (जो एक विकल्प होने का लाभ है जिसे आप उचित रूप में उपयोग कर सकते हैं जबकि वसंत एक या कुछ भी नहीं लगता है)
रिचर्ड

@RichardTingle स्प्रिंग डीआई के अलावा अन्य सभी चीजों के कारण एक लाभ का प्रतिनिधित्व कर सकता है, क्योंकि जाहिर है, आप कई अन्य तरीकों से डीआई प्राप्त कर सकते हैं, स्थैतिक कारखाने एक हो सकते हैं। (कम से कम एक शांत, लेकिन अभी भी।) लेकिन सवाल क्या पूछता है कि क्या डीआई प्राप्त करने के लिए वसंत का उपयोग करना आवश्यक है, और यही मैं जवाब देने की कोशिश कर रहा हूं: मूल रूप से, यह आवश्यक नहीं है, बस एक सुविधा ।
माइक नाकिस

यह एक उदाहरण है कि DI क्या नहीं है। ´TopLevel` को निर्माणकर्ता के तर्क के रूप में बनाते समय नहीं बनाना चाहिए MiddleLevel, बल्कि इसे प्राप्त करना चाहिए TopLevel। इसी तरह इसके निर्माता में MiddleLevelएक प्राप्त करना चाहिए LowLevel
स्पष्ट

1

कुछ साल पहले मैंने एक वेब पेज, वेब पोर्टलेट, यहां तक ​​कि कुछ डेटाबेस तालिकाओं पर नजर रखने के लिए एक कार्यक्रम लिखा था, जिस कंपनी में मैं काम करता था। मैं चाहता था कि यह इतना लचीला हो कि उपयोगकर्ता निर्दिष्ट कर सके कि कौन से मॉनिटर चलेंगे और किन मापदंडों (urls, logins, सफलता मानदंड, आदि) के साथ। इसलिए मैंने इसे एक्सएमएल फ़ाइल से पढ़ने के लिए लिखा था और निर्दिष्ट वर्गों को तुरंत सेट करने के लिए जावा प्रतिबिंब का उपयोग किया था और निर्दिष्ट मापदंडों को सेट करने के लिए सेटर विधियों का उपयोग किया था।

बाद में मैंने पाया कि वसंत आपके लिए एक ही काम करेगा, और एक पूरी बहुत कुछ।

इसलिए मेरे मामले में मैंने ऐसा पाया

  1. एक निर्भरता इंजेक्शन ढांचे का उपयोग करना कार्यक्रम को लचीला बनाने में मदद करता है और यह निर्दिष्ट करना आसान बनाता है कि यह कैसे काम करेगा (पाठ्यक्रम के अच्छी तरह से परिभाषित मापदंडों के भीतर)।

  2. थर्ड पार्टी DI फ्रेमवर्क का उपयोग करने से आप पहिये को फिर से मजबूत कर सकते हैं।


4
क्या आप इस बात के बारे में अधिक बता सकते हैं कि किस ठोस वर्ग का उपयोग परिभाषित करना एक जावा फाइल के बजाय एक xml के अंदर बेहतर है। यही वह चीज है जिसे मैंने कभी नहीं समझा।
रिचर्ड टिंगल

1
यह कोई जादू की गोली नहीं है, लेकिन कॉन्फ़िगर फ़ाइलों का उपयोग करने का एक फायदा यह है कि, कम से कम सिद्धांत रूप में, वे कोड की तुलना में संपादित करना आसान है। साथ ही, उन्हें एक उपयोगकर्ता द्वारा बदला जा सकता है जो आपके प्रोग्राम को चला रहा है लेकिन आपके स्रोत कोड तक पहुंच नहीं है। उदाहरण में मैंने अपने क्रूड डिपेंडेंसी इंजेक्शन प्रोग्राम के बारे में बताया, मैं कभी-कभी XML कॉन्फिग फाइल को बदल दूंगा ताकि मैं बदल सकूं कि प्रोग्राम कैसे चला, भले ही मैं वह था जिसने इसे लिखा था। यदि आपको बाहरी कॉन्फ़िगरेशन की आवश्यकता नहीं है, तो इसे कोड के साथ करना आसान हो सकता है। मेरे पास एक और नौकरी थी जहां हमने कोड में सभी डीआई किए और यह अच्छी तरह से काम किया।
पॉल जे अबर्नैथी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.