कैसल विंडसर क्या है, और मुझे क्यों परवाह करनी चाहिए?


190

मैं एक लंबे समय से विंडोज डेवलपर हूं, win32 और प्रारंभिक COM पर अपने दांत काट रहा हूं। मैं 2001 से .NET के साथ काम कर रहा हूं, इसलिए मैं C # और CLR में बहुत धाराप्रवाह हूं। जब तक मैंने स्टैक ओवरफ्लो में भाग लेना शुरू नहीं किया, मैंने कैसल विंडसर के बारे में कभी नहीं सुना। मैंने कैसल विंडसर "गेटिंग स्टार्टेड" गाइड पढ़ा है, लेकिन यह क्लिक नहीं कर रहा है।

इस पुराने कुत्ते को नई चालें सिखाएं, और मुझे बताएं कि मुझे अपने उद्यम ऐप में कैसल विंडसर को क्यों एकीकृत करना चाहिए।


1
उलटा नियंत्रण पर पढ़ें। यह आपकी निर्भरता को कम करने में मदद करने के लिए बहुत उपयोगी है, जो आपको इकाई परीक्षण लिखने में बहुत मदद करेगा, शुरुआत के लिए।
डेन सेशरपस्टर

जवाबों:


358

कैसल विंडसर नियंत्रण उपकरण का एक उलटा है। इसके जैसे और भी हैं।

यह आपको पूर्व-निर्मित और पूर्व-वायर्ड निर्भरता वाले ऑब्जेक्ट दे सकता है। "नया" ऑपरेटर के बजाय प्रतिबिंब और कॉन्फ़िगरेशन के माध्यम से बनाया गया एक संपूर्ण ऑब्जेक्ट ग्राफ।

यहां से शुरू करें: http://tech.groups.yahoo.com/group/altdotnet/message/10434


कल्पना कीजिए कि आपके पास एक ईमेल भेजने वाली कक्षा है। EmailSender। कल्पना कीजिए कि आपके पास एक और क्लास वर्कफ़्लोस्टेपर है। WorkflowStepper के अंदर आपको EmailSender का उपयोग करने की आवश्यकता है।

आप हमेशा कह सकते हैं new EmailSender().Send(emailMessage);

लेकिन वह - का उपयोग newएक तंग आवरण बनाता है जिसे बदलना मुश्किल है। (यह सब के बाद एक छोटे से वंचित उदाहरण है)

तो क्या हुआ अगर, इस बुरे लड़के को WorkflowStepper के अंदर नया करने के बजाय, आपने इसे कंस्ट्रक्टर में पास कर दिया?

तो फिर जिसने भी फोन किया उसे EmailSender को नया करना था।

new WorkflowStepper(emailSender).Step()

कल्पना कीजिए कि आपके पास इन सैकड़ों छोटी कक्षाएं हैं जिनमें केवल एक जिम्मेदारी है (google SRP) .. और आप उनमें से कुछ का उपयोग वर्कफ़्लो में करते हैं:

new WorkflowStepper(emailSender, alertRegistry, databaseConnection).Step()

कल्पना करें कि EmailSenderजब आप लिख रहे हों WorkflowStepperया जब आप विवरण के बारे में चिंता न करेंAlertRegistry

आप सिर्फ उस चिंता की चिंता करते हैं जिसके साथ आप काम कर रहे हैं।

कल्पना करें कि वस्तुओं और निर्भरताओं के इस पूरे ग्राफ (वृक्ष) को RUN TIME पर तार दिया जाता है, ताकि जब आप ऐसा करें:

WorkflowStepper stepper = Container.Get<WorkflowStepper>();

आपको WorkflowStepperउन सभी निर्भरताओं के साथ एक वास्तविक सौदा मिल जाता है, जो आपको उनकी ज़रूरत होती है।

कोई नहीं है new

यह बस होता है - क्योंकि यह जानता है कि क्या जरूरत है।

और आप बेहतर डिजाइन, कम परीक्षण और दोहराने योग्य तरीके से DRY कोड के साथ कम दोष लिख सकते हैं।


30
बहुत बढ़िया! अच्छा लिखा! अब मैं इसे लेकर उत्साहित हूं।
डेविड हिल

1
धन्यवाद। इसमें और भी बहुत कुछ है। मैंने एक बहुत ही सरल और दर्दनाक रूप से ठोस उदाहरण उठाया। आप कार्यान्वयन को बंद करने के लिए इंटरफेस का उपयोग कर सकते हैं। आप संपूर्ण असेंबली को ऑटो-कॉन्फ़िगर कर सकते हैं। आप जीवन चक्र को सिंगलटन या प्रति-http-request, आदि के रूप में निर्दिष्ट कर सकते हैं। चलते रहें - यह आपके काम को बदल देगा।
मैट हिंज

6
और जावा लोगों की मदद करने के लिए: यह .NET ;-)
के लिए गाइड है

5
मुझे लगता है कि मेरे अनुभव में यह डीबग करना कठिन है क्योंकि ऑब्जेक्ट्स को इनिशियलाइज़ कहाँ किया जाता है ?? - एक बड़े प्रोजेक्ट में इनिशियलाइजेशन का मूल खोजना कठिन है। मैं उपयोग करने के पुराने ढंग को पसंद करता newहूं, मुझे पता है कि सब कुछ तब कहां है। मुझे प्रतिबिंबों का उपयोग करने का विचार भी पसंद नहीं है और यह वास्तव में एक ब्लैक बॉक्स है, कोड हमारे पास नहीं है और इसलिए पूरी तरह से समझ में नहीं आता है।
ल्यूक टी ओ'ब्रायन ने

1
@ नशवान हां मैं यूनिट टेस्ट लिख रहा हूं, लेकिन आईओसी / डीआई के सिद्धांतों को कैसल विंडसर या किसी तीसरे पक्ष के ढांचे के बिना लागू किया जा सकता है, मेरे लिए यह सिर्फ एक और निर्भरता जोड़ता है, यह मेरी टिप्पणी का बिंदु था। मैं सिर्फ कैसल विंडसर के फायदे नहीं देखता।
ल्यूक टी ओ ब्रायन

4

मार्क सीमन ने डीआई (डिपेंडेंसी इंजेक्शन) पर उत्कृष्ट पुस्तक लिखी और आईओसी का एक उपसमुच्चय है। वह कई कंटेनरों की तुलना भी करता है। मैं इस पुस्तक की पर्याप्त अनुशंसा नहीं कर सकता। पुस्तक का नाम है: "निर्भरता इंजेक्शन .Net" https://www.manning.com/books/d dependency-injection-in-dot-net


3

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

लक्ष्य को पूरा करने का सबसे अच्छा तरीका है कि IoC (CW या Ninject आदि ..) राजनीति को खत्म करने के लिए # 1 और # 2 को खत्म करने के लिए एक छुरा लेता है, जिसे विकसित करते समय झूठी समझ के मोर्चे पर डाल दिया जाना चाहिए। क्या ये दोनों समाधान IoC से संबंधित नहीं हैं? वो हैं :)


3

कैसल विंडसर Dependency Injection container.इसका मतलब है कि इसकी मदद से आप अपने आश्रितों को इंजेक्ट कर सकते हैं और नए कीवर्ड की मदद से उन्हें बनाए बिना उनका उपयोग कर सकते हैं। उदाहरण पर विचार करें कि आपने एक रिपॉजिटरी या एक सेवा लिखी है और आप इसे कई स्थानों पर उपयोग करना चाहते हैं, आपको पहले अपनी सेवा / रिपॉजिटरी को पंजीकृत करना होगा और आवश्यक स्थान पर इसे इंजेक्ट करने के बाद आप इसका उपयोग करना शुरू कर सकते हैं। आप नीचे दिए गए ट्यूटोरियल पर एक नज़र डाल सकते हैं जो मैंने महल विंडसर सीखने के लिए पीछा किया था।

संपर्क

आशा है इससे आपकी मदद होगी।


1

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

तो या तो बहुत सारी कक्षाएं अनावश्यक रूप से बदल दी जाती हैं, आप कॉन्फ़िगरेशन मानों को एक बड़े कॉन्फ़िगर वर्ग में बाँध देते हैं जो कि बुरा भी है ... या सबसे खराब अभी भी लोकेटर लोकेटर पर जाएं!

IoC आपकी कक्षा को उस परेशानी के बिना अपनी सभी अवसादों को प्राप्त करने की अनुमति देता है, और उदाहरणों के जीवन काल को और भी स्पष्ट रूप से प्रबंधित करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.