119

मैं एकता (निर्भरता इंजेक्शन, नियंत्रण में उलटा) के बारे में एमएसडीएन पर लेख पढ़ रहा हूं, लेकिन मुझे लगता है कि मुझे इसे सरल शब्दों (या सरल उदाहरणों) में समझाया जाना चाहिए। मैं एमवीपीसी पैटर्न से परिचित हूं (हम इसे यहां इस्तेमाल करते हैं), लेकिन मैं अभी तक इस यूनिटी चीज को वास्तव में समझ नहीं सकता हूं, और मुझे लगता है कि यह हमारे एप्लिकेशन डिज़ाइन में अगला कदम है।क्या कोई माइक्रोसॉफ्ट यूनिटी को समझा सकता है?

+4

में जारी किया गया था मैं प्यार करता हूँ कि यह कैसे के रूप में "एकता" इसलिए जब मैं एकता खेल इंजन सामान के लिए खोज कर रहा हूँ मैं इस वर्ष तकनीक को देखने के एक ही नाम है को शामिल किया गया, आह। मुझे लगता है कि सभी अच्छे बैंड नाम लिया जाता है। –

उत्तर

139

यूनिटी सिर्फ एक आईओसी "कंटेनर" है। Google स्ट्रक्चर मैप और इसके बजाए इसे आज़माएं। ग्रोक करने के लिए थोड़ा आसान, मुझे लगता है, जब आईओसी सामान आपके लिए नया है।

असल में, यदि आप आईओसी समझते हैं तो आप समझते हैं कि आप जो भी कर रहे हैं, उस पर नियंत्रण होता है जब कोई ऑब्जेक्ट बनता है।

Ioc के बिना:

public class MyClass 
{ 
    IMyService _myService; 

    public MyClass() 
    { 
     _myService = new SomeConcreteService();  
    } 
} 
आईओसी कंटेनर के साथ

:

public class MyClass 
{ 
    IMyService _myService; 

    public MyClass(IMyService myService) 
    { 
     _myService = myService;  
    } 
} 
आईओसी के बिना

, अपने वर्ग कि IMyService पर निर्भर करता है नई-अप करने के लिए उपयोग करने के लिए सेवा का एक ठोस संस्करण है। और यह कई कारणों से खराब है (आपने अपनी कक्षा को IMYService के विशिष्ट कंक्रीट संस्करण में जोड़ा है, आप इसे आसानी से परीक्षण नहीं कर सकते हैं, आप इसे आसानी से नहीं बदल सकते हैं, आदि)

साथ एक आईओसी कंटेनर आप उन निर्भरताओं को हल करने के लिए कंटेनर को "कॉन्फ़िगर" करता है। तो एक कन्स्ट्रक्टर-आधारित इंजेक्शन योजना के साथ, आप केवल इंटीरियर को आईएमई सेवा निर्भरता के लिए निर्माता में पास करते हैं। जब आप अपने कंटेनर के साथ MyClass बनाते हैं, तो आपका कंटेनर आपके लिए IMyService निर्भरता को हल करेगा। "। जब कोई IMyService अनुरोध करता है, उन्हें SomeConcreteService की एक प्रति दे"

StructureMapConfiguration.ForRequestedType<MyClass>().TheDefaultIsConcreteType<MyClass>(); 
StructureMapConfiguration.ForRequestedType<IMyService>().TheDefaultIsConcreteType<SomeConcreteService>(); 

तो तुम क्या किया है कंटेनर, बताया जाता है:

StructureMap का उपयोग करना, कंटेनर को विन्यस्त इस तरह दिखता है और आपने यह भी निर्दिष्ट किया है कि जब कोई MyClass मांगता है, तो उसे एक ठोस MyClass मिलता है।

यह सब एक आईओसी कंटेनर वास्तव में करता है। वे और अधिक कर सकते हैं, लेकिन यह इसका जोर है - वे आपके लिए निर्भरताओं को हल करते हैं, इसलिए आपको (और आपको अपने कोड में "नया" कीवर्ड का उपयोग करने की आवश्यकता नहीं है)।

अंतिम चरण: जब आप अपने MyClass बनाते हैं, तो आप इस करना होगा:

var myClass = ObjectFactory.GetInstance<MyClass>(); 

आशा है कि मदद करता है। आप मुझे ईमेल कर सकते हैं।

+2

तो यह एक कारखाने की तरह है, मुझे लगता है?यदि मैं इसे सही तरीके से पालन कर रहा हूं, तो क्या आप अंतिम उदाहरण में के बजाय का उपयोग नहीं करेंगे? तो यह var myClass = ObjectFactory.GetInstance () होगा? आपकी मदद के लिए धन्यवाद, यह मेरे लिए एक अच्छी शुरुआत है! –

+3

एक तरह से, यह एक कारखाने की तरह है, हाँ। आपके आवेदन के लिए एक मास्टर कारखाना। लेकिन इसे सिंगलेट सहित कई अलग-अलग प्रकारों को वापस करने के लिए कॉन्फ़िगर किया जा सकता है। माइक्रोसॉफ्ट के इंटरफ़ेस के लिए - यदि यह एक व्यावसायिक वस्तु है, तो मैं एक इंटरफ़ेस निकालने वाला नहीं होगा। बाकी सब कुछ के लिए, मैं आम तौर पर करता हूं। –

+0

क्या होगा यदि आपको केवल ऑब्जेक्टफैक्टरी कहा जाता है। गेटइंस्टेंस (); और आपने SomeConcreteClass को कॉन्फ़िगर नहीं किया है? क्या आप उस मामले में प्राप्त करेंगे और त्रुटि करेंगे? – RayLoveless

27

यूनिटी कई अन्य लोगों की तरह एक पुस्तकालय है जो आपको स्वयं को बनाने के बिना अनुरोधित प्रकार का उदाहरण प्राप्त करने की अनुमति देता है। तो दिया गया।

public interface ICalculator 
{ 
    void Add(int a, int b); 
} 

public class Calculator : ICalculator 
{ 
    public void Add(int a, int b) 
    { 
     return a + b; 
    } 
} 

आप कैलक्यूलेटर रजिस्टर करने के लिए एकता की तरह एक पुस्तकालय का प्रयोग करेंगे जब प्रकार ICalculator उर्फ ​​आईओसी (नियंत्रण के उलट) अनुरोध किया जाता है वापस करने (इस उदाहरण सैद्धांतिक, तकनीकी रूप से सही नहीं है)।

IoCLlibrary.Register<ICalculator>.Return<Calculator>(); 

तो अब जब आप एक ICalculator का एक उदाहरण चाहते हैं तो आप सिर्फ ...

Calculator calc = IoCLibrary.Resolve<ICalculator>(); 

आईओसी पुस्तकालयों आम तौर पर करने के लिए विन्यस्त किया जा सकता है या तो एक सिंगलटन पकड़ या एक नया उदाहरण हर बार बनाने यदि आप एक हल प्रकार।

अब मान लीजिए कि आप एक वर्ग है कि एक ICalculator पर निर्भर करता है वर्तमान आप हो सकता था होना जरूरी जाने ..

public class BankingSystem 
{ 
    public BankingSystem(ICalculator calc) 
    { 
     _calc = calc; 
    } 

    private ICalculator _calc; 
} 

और आप सेटअप पुस्तकालय कब बनाया जाता है निर्माता में एक वस्तु इंजेक्षन कर सकते हैं।

तो डी या निर्भरता इंजेक्शन का मतलब है किसी अन्य वस्तु को इंजेक्ट करने की आवश्यकता है।

8

यूनिटी एक आईओसी है। आईओसी का मुद्दा खुद के प्रकारों के बाहर निर्भरताओं की तारों को सार करना है। इसमें कुछ फायदे हैं। सबसे पहले, यह केंद्रीय रूप से किया जाता है जिसका मतलब है कि निर्भरता में परिवर्तन होने पर आपको बहुत सारे कोड को बदलने की ज़रूरत नहीं है (जो यूनिट परीक्षणों का मामला हो सकता है)।

इसके अलावा, अगर तारों कोड के बजाय विन्यास डेटा का उपयोग किया जाता है, तो आप वास्तव में तैनाती के बाद निर्भरता rewire कर सकते हैं और इस तरह कोड को बदले बिना आवेदन के व्यवहार को बदलने।

35

मैंने डेविड हेडन द्वारा 30 मिनट एकता निर्भरता इंजेक्शन आईओसी स्क्रीनकास्ट देखा और महसूस किया कि उदाहरणों के साथ एक अच्छी व्याख्या थी।

  • पंजीयन प्रकार बनाना नहीं कंटेनर में
  • पंजीयन और समाधान करना TypeMappings
  • और:

    स्क्रीनकास्ट जैसे एकता आईओसी के कई आम प्रयोगों से पता चलता है: यहाँ शो नोटों से एक टुकड़ा है नामित टाइपमैपिंग

  • सिंगलेट्स, लाइफटाइम प्रबंधक, और कंटेनर नियंत्रित नियंत्रित लाइफटाइमैन
  • मौजूदा उदाहरणों को पंजीकृत करना
  • मौजूदा उदाहरण
  • App.config/Web.config
  • इंजेक्शन एपीआई के माध्यम से निर्भरता निर्दिष्ट के माध्यम से UnityContainer से पॉप्युलेट के रूप में निर्भरता के लिए विरोध में इंजेक्शन लगाने निर्भरता गुण
  • का उपयोग नेस्ट (अभिभावक बच्चा) कंटेनर
21

यह लड़का विल्कोक्स ट्यूटोरियल यूनिटी कंटेनर का एक उत्कृष्ट प्रदर्शन प्रदान करता है जिसका उद्देश्य शुरुआती लोगों के लिए है।

भाग 1: http://www.youtube.com/watch?v=CWwe9Z0Gyew

भाग 2: http://www.youtube.com/watch?v=PsIbevgzQQE

आधे घंटे से भी कम एक में और आप मूल बातें समझ जाएगा!

+1

वे वास्तव में सहायक vids थे – gdubs

4

एमएसडीएन में Developer's Guide to Dependency Injection Using Unity है जो उपयोगी हो सकता है।

डेवलपर की मार्गदर्शिका किस निर्भरता इंजेक्शन की मूल बातें के साथ शुरू होती है, और निर्भरता इंजेक्शन के लिए एकता का उपयोग करने के उदाहरणों के साथ जारी है। फरवरी 2014 तक डेवलपर की मार्गदर्शिका एकता 3.0, जो अप्रैल 2013

संबंधित मुद्दे