मुझे पता है कि यह सवाल पुराना है, लेकिन मैं अपने पांच सेंट जोड़ना चाहूंगा,
मुझे लगता है कि निर्भरता इंजेक्शन (DI) कई तरह से एक विन्यास योग्य फैक्ट्री पैटर्न (FP) की तरह है, और इस अर्थ में कि आप DI के साथ जो कुछ भी कर सकते हैं, आप इस तरह के कारखाने के साथ कर पाएंगे।
वास्तव में, यदि आप उदाहरण के लिए वसंत का उपयोग करते हैं, तो आपके पास ऑटोवेयरिंग संसाधन (DI) या ऐसा कुछ करने का विकल्प है:
MyBean mb = ctx.getBean("myBean");
और फिर कुछ भी करने के लिए उस 'mb' उदाहरण का उपयोग करें। नहीं है कि एक कारखाने के लिए एक फोन है कि आप एक उदाहरण वापस आ जाएगी ??
एफपी उदाहरणों में से अधिकांश के बीच एकमात्र वास्तविक अंतर मुझे लगता है कि आप "myBean" को xml या किसी अन्य वर्ग में कॉन्फ़िगर कर सकते हैं, और एक ढांचा कारखाने के रूप में काम करेगा, लेकिन इसके अलावा अन्य एक ही बात है, और आप एक निश्चित रूप से एक कारखाना हो सकता है जो एक विन्यास फाइल को पढ़ता है या इसे कार्यान्वयन की आवश्यकता के रूप में प्राप्त करता है।
और अगर आप मुझसे मेरी राय पूछते हैं (और मुझे पता है कि आप नहीं थे), मेरा मानना है कि DI एक ही काम करता है, लेकिन सिर्फ विकास के लिए और अधिक जटिलता जोड़ता है, क्यों?
ठीक है, एक बात के लिए, यह जानने के लिए कि डीआई के साथ किसी भी बीन के लिए उपयोग किए जा रहे कार्यान्वयन को क्या करना है, आपको कॉन्फ़िगरेशन में ही जाना होगा।
लेकिन ... उस वादे के बारे में क्या है जो आपको उस वस्तु के कार्यान्वयन को जानने का नहीं होगा जो आप उपयोग कर रहे हैं? pfft! गंभीरता से? जब आप इस तरह एक दृष्टिकोण का उपयोग करते हैं ... तो क्या आप वही नहीं हैं जो कार्यान्वयन लिखते हैं ?? और यहां तक कि अगर आप नहीं करते हैं, तो आपको लगभग हर समय यह देखना चाहिए कि कार्यान्वयन कैसे होता है जो इसे करना चाहिए?
और एक आखिरी बात के लिए, इससे कोई फर्क नहीं पड़ता कि कोई DI फ्रेमवर्क आपको कितना वादा करता है कि आप इससे जुड़ी चीजों का निर्माण करेंगे , उनकी कक्षाओं के लिए कोई निर्भरता नहीं है, अगर आप एक ऐसे ढांचे का उपयोग कर रहे हैं जो आप सब कुछ पैदा करते हैं, अगर आपको यह करना है दृष्टिकोण या रूपरेखा बदलें यह एक आसान काम नहीं होगा ... कभी नहीं! ... लेकिन, जब से आप अपने व्यवसाय के लिए सबसे अच्छा समाधान व्हाट्सएप के बारे में चिंता करने के बजाय उस विशेष ढांचे के चारों ओर सब कुछ बनाते हैं, तो ऐसा करते समय आपको बायिग प्रोबलेन का सामना करना पड़ेगा।
वास्तव में, एफपी या डीआई दृष्टिकोण के लिए एकमात्र वास्तविक व्यावसायिक अनुप्रयोग जो मैं देख सकता हूं, यदि आपको रनटाइम पर उपयोग किए जा रहे कार्यान्वयन को बदलने की आवश्यकता है , लेकिन कम से कम मुझे पता है कि आपको ऐसा करने की अनुमति नहीं है, आपको छोड़ना होगा विकास के समय कॉन्फ़िगरेशन में सब कुछ सही है अगर आपको ज़रूरत है कि दूसरे दृष्टिकोण का उपयोग करें।
इसलिए, यदि मेरे पास एक ऐसा वर्ग है जो एक ही एप्लिकेशन में दो स्कोप में अलग-अलग कार्य करता है (जो कहता है, होल्डिंग की दो कंपनियां) मुझे दो अलग-अलग बीन्स बनाने के लिए फ्रेमवर्क कॉन्फ़िगर करना होगा, और प्रत्येक का उपयोग करने के लिए अपने कोड को अनुकूलित करना होगा। ऐसा नहीं है कि जैसे मैं सिर्फ कुछ इस तरह लिखूंगा:
MyBean mb = MyBeanForEntreprise1(); //In the classes of the first enterprise
MyBean mb = MyBeanForEntreprise2(); //In the classes of the second enterprise
इस रूप में ही:
@Autowired MyBean mbForEnterprise1; //In the classes of the first enterprise
@Autowired MyBean mbForEnterprise2; //In the classes of the second enterprise
और इस:
MyBean mb = (MyBean)MyFactory.get("myBeanForEntreprise1"); //In the classes of the first enterprise
MyBean mb = (MyBean)MyFactory.get("myBeanForEntreprise2"); //In the classes of the second enterprise
किसी भी मामले में आपको अपने आवेदन में कुछ बदलना होगा, चाहे कक्षाएं या कॉन्फ़िगरेशन फाइलें हों, लेकिन आपको इसे एक रीडेपॉइल करना होगा।
क्या ऐसा कुछ करना अच्छा नहीं होगा:
MyBean mb = (MyBean)MyFactory.get("mb");
और इस तरह, आप लॉग इन उपयोगकर्ता उद्यम के आधार पर रनटाइम पर सही कार्यान्वयन प्राप्त करने के लिए कारखाने का कोड निर्धारित करते हैं ?? अब यह मददगार होगा। आप बस नई कक्षाओं के साथ एक नया जार जोड़ सकते हैं और नियमों को सेट भी कर सकते हैं, यहां तक कि रनटाइम पर भी (या यदि आप इस विकल्प को खुला छोड़ देते हैं तो एक नई कॉन्फ़िगरेशन फ़ाइल जोड़ सकते हैं), मौजूदा कक्षाओं में कोई परिवर्तन नहीं। यह एक गतिशील कारखाना होगा!
प्रत्येक उद्यम के लिए दो विन्यास लिखने की तुलना में यह अधिक उपयोगी नहीं होगा, और शायद प्रत्येक के लिए दो अलग-अलग अनुप्रयोग भी हो सकते हैं ??
आप मुझे बता सकते हैं, मुझे कभी भी रनटाइम पर स्विच करने की आवश्यकता नहीं है, इसलिए मैं ऐप को कॉन्फ़िगर करता हूं, और अगर मुझे क्लास विरासत में मिलती है या किसी अन्य कार्यान्वयन का उपयोग करता है तो मैं बस कॉन्फ़िगरेशन और रीडेप्लॉय को बदल देता हूं। ठीक है, वह भी एक कारखाने के साथ किया जा सकता है। और ईमानदार बनो, तुम ऐसा कितनी बार करते हो? हो सकता है कि जब आपके पास कोई ऐसा ऐप हो जो आपकी कंपनी में कहीं और इस्तेमाल होने वाला हो, और आप किसी दूसरी टीम को कोड देने जा रहे हों, और वे इस तरह की चीजें करेंगे। लेकिन हे, कि कारखाने के साथ भी किया जा सकता है, और एक गतिशील कारखाने के साथ भी बेहतर होगा !!
वैसे भी, टिप्पणी अनुभाग यदि आप मुझे मारने के लिए खुले हैं।