2010-06-22 4 views

उत्तर

4

इसके मूल पर एक डी कंटेनर इंटरफेस और कंक्रीट प्रकारों के बीच मैपिंग पर आधारित वस्तुओं को बनाता है।

यह आपको कंटेनर से एक अमूर्त प्रकार अनुरोध करने के लिए अनुमति देगा:

IFoo f = container.Resolve<IFoo>(); 

इसके लिए आवश्यक है कि आप पहले से है कि कॉन्फ़िगर किया गया कंटेनर एक ठोस वर्ग कि IFoo (उदाहरण के फू के लिए लागू करता है करने के लिए IFoo से मैप करने के लिए)।

अपने आप में यह विशेष रूप से प्रभावशाली नहीं होगा, लेकिन डि कंटेनरों अधिक कार्य करें:

  • वे स्वत: तारों जिसका मतलब है कि वे अपने आप पता लगा सकते हैं कि Ibar को नक्शे IFoo फू का मानचित्रण और यदि का उपयोग बार, लेकिन फू की आईबीआर पर निर्भरता है, जब आप IFoo का अनुरोध करते हैं तो यह बार के साथ एक Foo उदाहरण बनाएगा।
  • वे जीवनकाल घटकों का प्रबंधन करते हैं। आप कई बार हर बार फू का एक नया उदाहरण चाहते हैं, लेकिन अन्य मामलों में आप एक ही उदाहरण चाहते हैं। आप हर बार फू के नए उदाहरण भी चाह सकते हैं, लेकिन इंजेक्शन बार एक ही उदाहरण रहना चाहिए।

एक बार जब आप मैन्युअल रूप से प्रबंधित करने के लिए रचना और जीवन काल आप एक डि कंटेनर :) द्वारा प्रदान की गई सेवाओं की प्रशंसा

कई डि कंटेनरों से ऊपर की तुलना में अधिक कर सकते हैं शुरू कर देना चाहिए की कोशिश कर रहा शुरू करते हैं, लेकिन उन कोर सेवाएं हैं। अधिकांश कंटेनर configuring via either code or XML के लिए विकल्प प्रदान करते हैं।

जब उचित उपयोग कंटेनरों के उपयोग की बात आती है, तो क्रिज़्ज़टॉफ कोज़मिक ने अभी a good overview प्रकाशित किया है।

2

आप एक डी कंटेनर कॉन्फ़िगर करते हैं, इसलिए यह आपके इंटरफेस और प्रकारों के बारे में जानता है - प्रत्येक इंटरफेस एक प्रकार के मानचित्र कैसे करता है।

जब आप Resolve पर कॉल करते हैं, तो यह मैपिंग को देखता है और आपके द्वारा अनुरोधित मैप किए गए ऑब्जेक्ट को वापस देता है।

कुछ डी कंटेनर कॉन्फ़िगरेशन पर सम्मेलनों का उपयोग करते हैं, उदाहरण के लिए, यदि आप ISomething इंटरफ़ेस को परिभाषित करते हैं, तो यह तत्काल और वापसी के लिए एक ठोस Something प्रकार की तलाश करेगा।

+0

लघु और मीठे और विषाक्त कार एनालॉजी से मुक्त! – Shog9

4

"यह वस्तुओं की एक फैंसी हैश तालिका से ज्यादा कुछ नहीं है।"

जबकि ऊपर एक बड़े पैमाने पर ख़ामोश उनके बारे में सोच की आसान तरीका है कि है। संग्रह को देखते हुए, यदि आप किसी वर्ग के समान उदाहरण के लिए पूछते हैं - डी कंटेनर यह तय करेगा कि आपको कैश किए गए संस्करण या एक नया, या ऐसा करना है या नहीं।

निर्भरता तारों की तारों की बात आने पर उनका उपयोग इसे आसान और साफ करता है। कल्पना करें कि आपके पास निम्नलिखित छद्म वर्ग हैं।

class House(Kitchen, Bedroom) 
    // Use kitchen and bedroom. 
end 

class Kitchen() 
    // Code... 
end 

class Bedroom() 
    // Code... 
end 

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

डि/आईओसी कंटेनर के बिना:

house = new House(new Kitchen(), new Bedroom()); 
डि साथ

/आईओसी कंटेनर:

house = // some method of getting the house 

दिन के अंत में वे कोड का पालन करने के लिए आसान, आसान लिख सकते हैं और जिम्मेदारी शिफ्ट करने के लिए बनाने के हाथ से समस्या से दूर तारों की वस्तुओं के साथ।

+0

यह ध्यान दिया जाना चाहिए कि DI अच्छा है क्योंकि यह आपको चीजों को कॉन्फ़िगर करने और अन्य सामानों के समूह को कॉन्फ़िगर करने के लिए अपने स्वयं के जटिल कन्स्ट्रक्टर और अपना कोड लिखने से रोकता है। हां, आपको * इसकी आवश्यकता नहीं है, यह आपके लिए उन सभी चीजों को संभालने के लिए मौजूदा लाइब्रेरी का लाभ उठाने में सक्षम होना अच्छा है। यह जावा अनुप्रयोगों को कॉन्फ़िगर करता है (सी # मेरा विशेषज्ञता क्षेत्र नहीं है) एक गरीब, असंगत, अति-जटिल - स्क्रिप्टिंग भाषा के साथ काम करने जैसा थोड़ा सा दिखता है ... –