यह उत्कीर्ण जवाब के समान है लेकिन मैं जोर से सोचना चाहता हूं - शायद दूसरों को भी इस तरह से चीजें दिखाई देती हैं।
शास्त्रीय OO वर्ग के उपभोक्ताओं के लिए सार्वजनिक "इनिशियलाइज़ेशन" अनुबंध को परिभाषित करने के लिए कंस्ट्रक्टर्स का उपयोग करता है (सभी कार्यान्वयन विवरणों को छिपाकर उर्फ इनकैप्सुलेशन)। यह अनुबंध सुनिश्चित कर सकता है कि तात्कालिकता के बाद आपके पास एक तैयार-से-उपयोग की जाने वाली वस्तु है (यानी उपयोगकर्ता द्वारा याद किए जाने (एर, भूल गए) के लिए कोई अतिरिक्त आरंभीकरण चरण नहीं)।
(कंस्ट्रक्टर) DI इस सार्वजनिक कंस्ट्रक्टर इंटरफेस के माध्यम से अप्रत्यक्ष रूप से रक्तस्राव विस्तार से एनकैप्सुलेशन को तोड़ता है। जब तक हम अभी भी उपयोगकर्ताओं के लिए इनिशियलाइज़ेशन कॉन्ट्रैक्ट को परिभाषित करने के लिए सार्वजनिक निर्माणकर्ता को जिम्मेदार मानते हैं, तब तक हमने एनकैप्सुलेशन का भयानक उल्लंघन किया है।
सैद्धांतिक उदाहरण:
क्लास फू के 4 तरीके हैं और इनिशियलाइजेशन के लिए एक पूर्णांक की जरूरत होती है, इसलिए इसका निर्माता फू (इंट आकार) जैसा दिखता है और यह क्लास फू के उपयोगकर्ताओं के लिए तुरंत स्पष्ट है कि वे फू को काम करने के लिए तुरंत आकार प्रदान करें ।
यह कहें कि फू के इस विशेष कार्यान्वयन को अपना काम करने के लिए IWidget की आवश्यकता हो सकती है । इस निर्भरता के कंस्ट्रक्टर इंजेक्शन ने हमें फू (इंट आकार, आईवेट विजेट) जैसा एक निर्माता बनाया होगा
इसके बारे में मुझे क्या पता है कि अब हमारे पास एक कंस्ट्रक्टर है जो निर्भरता के साथ आरंभीकरण डेटा सम्मिश्रण कर रहा है - एक इनपुट वर्ग के उपयोगकर्ता ( आकार ) के लिए रुचि रखता है , दूसरा एक आंतरिक निर्भरता है जो केवल उपयोगकर्ता को भ्रमित करने के लिए कार्य करता है और कार्यान्वयन है विवरण ( विजेट )।
आकार पैरामीटर एक निर्भरता नहीं है - यह एक प्रति-उदाहरण आरंभीकरण मूल्य सरल है। आईओसी बाहरी निर्भरता (जैसे विजेट) के लिए बांका है, लेकिन आंतरिक स्थिति के प्रारंभ के लिए नहीं।
इससे भी बदतर, क्या होगा अगर इस वर्ग पर विजेट केवल 4 में से 2 तरीकों के लिए आवश्यक है; मैं विजेट के लिए तात्कालिक ओवरहेड हो सकता है, भले ही इसका इस्तेमाल न किया जाए!
इससे समझौता / सामंजस्य कैसे करें?
एक दृष्टिकोण ऑपरेशन अनुबंध को परिभाषित करने के लिए इंटरफेस पर विशेष रूप से स्विच करना है; और उपयोगकर्ताओं द्वारा निर्माणकर्ताओं के उपयोग को समाप्त कर दिया गया। सुसंगत होने के लिए, सभी वस्तुओं को केवल इंटरफेस के माध्यम से एक्सेस किया जाना होगा, और केवल रिवाल्वर (IOC / DI कंटेनर की तरह) के कुछ फॉर्म के माध्यम से त्वरित किया जाएगा। केवल कंटेनर को तुरंत चीजें मिलती हैं।
यह विजेट निर्भरता का ख्याल रखता है, लेकिन हम फू इंटरफ़ेस पर एक अलग आरंभीकरण विधि का सहारा लिए बिना "आकार" कैसे शुरू करते हैं? इस समाधान का उपयोग करते हुए, हमने यह सुनिश्चित करने की क्षमता खो दी कि फू का एक उदाहरण आपके द्वारा प्राप्त किए जाने वाले समय से पूरी तरह से शुरू हो जाता है। Bummer, क्योंकि मुझे वास्तव में कंस्ट्रक्टर इंजेक्शन का विचार और सरलता पसंद है ।
इस डीआई दुनिया में मैं गारंटीकृत आरंभीकरण कैसे प्राप्त कर सकता हूं, जब इनिशियलाइज़ेशन केवल बाहरी निर्भरता से अधिक है?