मान लें कि हमारे पास 1001 ग्राहक हैं जो अपनी निर्भरता का निर्माण सीधे स्वीकार इंजेक्शन के बजाय करते हैं। हमारे बॉस के अनुसार 1001 को फिर से भरना एक विकल्प नहीं है। हमें वास्तव में उनके स्रोत तक पहुँचने की अनुमति नहीं है, सिर्फ क्लास की फाइलें।
हम जो करने जा रहे हैं, वह "आधुनिक" है, जो इन 1001 क्लाइंट्स के माध्यम से होता है। हम सभी को पसंद कर सकते हैं। निर्भरताएं उस प्रणाली का हिस्सा हैं। और उनमें से कुछ निर्भरताएँ जिन्हें हम एक नए कार्यान्वयन के लिए बदलने वाले हैं।
हम ग्राहकों की इस भीड़ को संतुष्ट करने के लिए निर्भरता के विभिन्न कार्यान्वयन को कॉन्फ़िगर करने की क्षमता रखते हैं। अफसोस की बात है कि DI एक विकल्प नहीं है क्योंकि ग्राहक कंस्ट्रक्टर या सेटर के साथ इंजेक्शन स्वीकार नहीं करते हैं।
विकल्प:
1) ग्राहकों द्वारा उपयोग की जाने वाली सेवा के कार्यान्वयन को रिफ्लेक्टर करें ताकि यह वह कार्य करे जो अब ग्राहकों को चाहिए। बैंग हम कर रहे हैं। लचीला नहीं है। जटिल नहीं है।
2) कार्यान्वयन को रिफ्लेक्टर करें ताकि यह दर्शाता है कि यह एक और निर्भरता के लिए काम करता है जो इसे एक कारखाने के माध्यम से प्राप्त करता है। अब हम इस बात को नियंत्रित कर सकते हैं कि वे कौन से कार्यान्वयन का उपयोग कारखाने को रिफलेक्ट करके करते हैं।
3) कार्यान्वयन को रिफ्लेक्टर करें ताकि यह दर्शाता है कि यह एक और निर्भरता के लिए काम करता है जो इसे सेवा लोकेटर के माध्यम से प्राप्त करता है। अब हम नियंत्रित कर सकते हैं कि वे किस कार्यान्वयन का उपयोग सेवा लोकेटर को कॉन्फ़िगर करके करते हैं जो कि hashmap
थोड़े से कास्टिंग के साथ वस्तुओं के लिए तार हो सकता है ।
4) कुछ मैंने अभी तक सोचा भी नहीं है।
लक्ष्य:
व्यर्थ की जटिलता को जोड़े बिना पुराने खराब डिज़ाइन किए गए क्लाइंट कोड को भविष्य में खींचकर डिज़ाइन की क्षति को कम करें।
ग्राहकों को अपनी निर्भरता के कार्यान्वयन को जानना या नियंत्रित नहीं करना चाहिए, लेकिन वे उनके साथ निर्माण करने पर जोर देते हैं new
। हम नियंत्रण नहीं कर सकते, new
लेकिन हम उस वर्ग को नियंत्रित करते हैं जिसका वे निर्माण कर रहे हैं।
मेरा प्रश्न:
मैं क्या विचार करने में असफल रहा?
क्या आपको वास्तव में विभिन्न कार्यान्वयनों के बीच कॉन्फ़िगर करने की संभावना की आवश्यकता है? किस लिए?
चपलता। अनजान लोगों का बहुत। प्रबंधन बदलाव की क्षमता चाहता है। केवल बाहरी दुनिया पर निर्भरता खो देते हैं। परीक्षण भी।
क्या आपको विभिन्न कार्यान्वयनों के बीच स्विच करने के लिए एक रन टाइम मैकेनिक या बस एक संकलन समय मैकेनिक की आवश्यकता है? क्यों?
संकलन समय यांत्रिकी पर्याप्त है। सिवाय परीक्षण के।
कार्यान्वयन के बीच आपको किस ग्रैन्युलैरिटी को स्विच करने की आवश्यकता है? यकायक? प्रति मॉड्यूल (प्रत्येक वर्ग के एक समूह से युक्त)? प्रति वर्ग?
1001 में से केवल एक ही समय में सिस्टम के माध्यम से चलाया जाता है। सभी ग्राहक जो एक बार में उपयोग करते हैं, उन्हें बदलना संभव है। हालांकि निर्भरता का व्यक्तिगत नियंत्रण महत्वपूर्ण है।
स्विच को नियंत्रित करने की आवश्यकता किसे है? केवल आपकी / आपकी डेवलपर टीम? एक प्रशासक? प्रत्येक ग्राहक अपने दम पर? या ग्राहक के कोड के लिए रखरखाव डेवलपर्स? तो मैकेनिक होने के लिए कितना आसान / मजबूत / मूर्ख है?
परीक्षण के लिए देव। बाहरी हार्डवेयर निर्भरता के रूप में व्यवस्थापक बदलते हैं। इसे परीक्षण और कॉन्फ़िगर करना आसान होना चाहिए।
हमारा लक्ष्य यह दिखाना है कि प्रणाली को जल्दी और आधुनिक बनाया जा सकता है।
कार्यान्वयन स्विच के लिए वास्तविक उपयोग का मामला?
एक है, हार्डवेयर समाधान तैयार होने तक कुछ डेटा सॉफ्टवेयर द्वारा प्रदान किया जाएगा।