2009-11-11 13 views
7

क्या कोई मुझे समझा सकता है कि यूनिटी एप्लिकेशन ब्लॉक का उद्देश्य क्या है? मैंने प्रलेखन को देखने की कोशिश की लेकिन यह सब बहुत ही सार है।माइक्रोसॉफ्ट एंटरप्राइज़ लाइब्रेरी में यूनिटी एप्लिकेशन ब्लॉक का उद्देश्य?

यूनिटी ब्लॉक के लिए कुछ व्यावहारिक उपयोग क्या हैं?

उत्तर

15

नियंत्रण

एक त्वरित योग के उलट (बहुत अधिक पढ़ने इस विषय उपलब्ध है, और मैं अत्यधिक अधिक पढ़ने का सुझाव) ...

एंटरप्राइज़ पैटर्न और प्रैक्टिस टीम से माइक्रोसॉफ्ट की एकता नियंत्रण कंटेनर प्रोजेक्ट का एक उलटा है, या आईओसी संक्षिप्त है। कैसल विंडसर, स्ट्रक्चर मैप इत्यादि की तरह। इस प्रकार के विकास को लैमेन के शब्दों में भी आपके घटकों को लूपली के रूप में संदर्भित किया जाता है।

आईओसी में आपकी ऑब्जेक्ट्स की निर्भरता इंजेक्शन के लिए एक पैटर्न शामिल है, जिसमें आप अपनी वस्तुओं के भीतर निर्भरताओं को तारित करने के लिए बाहरी घटक पर भरोसा करते हैं।

उदाहरण के लिए, स्थिर प्रबंधकों (जो इकाई परीक्षण के लिए असंभव हैं) तक पहुंचने के बजाय, आप एक ऐसी वस्तु बनाते हैं जो कार्य करने के लिए बाहरी निर्भरता पर निर्भर करता है। आइए एक पोस्ट सेवा लें जिसमें आप पोस्ट प्राप्त करने के लिए डीबी तक पहुंचना चाहते हैं।

public class PostService : IPostService 
{ 
    private IPostRepository _postRepo; 

    public PostService(IPostRepository postRepo) 
    { 
    _postRepo = postRepo; 
    } 

    public IList<Post> GetPosts() 
    { 
    return _postRepo.GetAllPosts().ToList(); 
    } 
} 

यह PostService वस्तु अब IPostRepository पर एक बाहरी निर्भरता है। ध्यान दें कि कैसे कोई ठोस नहीं है और कोई स्थिर प्रबंधक वर्ग का उपयोग नहीं किया जाता है?इसके बजाए, आपके पास एक सरल इंटरफेस के ढीले-युग्मन हैं - जो आपको आईपीओस्ट रिपोजिटरी को लागू करने वाले सभी प्रकार के ठोस वर्गों को तारों की तार देता है।

माइक्रोसॉफ्ट यूनिटी का उद्देश्य स्वचालित रूप से आपके लिए उस IPostRepository को तार करना है। तो तुम क्या कर के बारे में चिंता करने की आवश्यकता नहीं:

// you never have to do this with Unity 
IPostRepository repo = new PostRepository(); 
IPostService service = new PostService(repo); // dependency injection 
IList<Post> posts = service.GetPosts(); 

ऊपर से पता चलता है जहां दो ठोस वर्ग, PostRepository() और PostService() को लागू करने की है। यह कड़ाई से आपके आवेदन को उन सटीक उदाहरणों की मांग/आवश्यकता के लिए जोड़ रहा है, और यूनिट परीक्षण के लिए इसे बहुत मुश्किल छोड़ देता है।

इसके बजाय, आप अपना अंतिम बिंदु (ASPX पृष्ठों में MVC में नियंत्रक, या कोड के पीछे) में एकता का प्रयोग करेंगे:

IUnityContainer ioc = new UnityContainer(); 
IPostService postService = ioc.Resolve<IPostService>(); 
IList<Post> posts = postService.GetPosts(); 

कोई (UnityContainer और पोस्ट को छोड़कर इस उदाहरण में प्रयुक्त concretes हैं ध्यान दें कि , जाहिर है)! सेवाओं का कोई concretes, और कोई भंडार नहीं। यह अपने बेहतरीन पर कमजोर जोड़ रहा है।

यहाँ असली किकर है ...

एकता (या वहाँ किसी भी आईओसी कंटेनर ढांचे!) किसी भी निर्भरता के लिए IPostService निरीक्षण करेंगे। यह देखेंगे कि यह IPostRepository के उदाहरण पर (निर्भर करता है) चाहता है। इसलिए, एकता इसके ऑब्जेक्ट मैप में जायेगी और पहली ऑब्जेक्ट की तलाश करेगी जो आईपीओस्ट रिपोजिटरी लागू करती है जो कंटेनर के साथ पंजीकृत थी, और इसे वापस लौटाएं (यानी एक एसक्लपोस्ट रिपोजिटरी इंस्टेंस)। आईओसी ढांचे के पीछे असली शक्ति है - सेवाओं का निरीक्षण करने और स्वचालित रूप से किसी भी निर्भरता को तारित करने की शक्ति।

मुझे यूनिटी बनाम कैसल बनाम स्ट्रक्चर मैप की तुलना के बारे में अपना ब्लॉग पोस्ट पूरा करने की आवश्यकता है। मैं वास्तव में इसके कॉन्फ़िगरेशन फ़ाइल विकल्पों और एक्स्टेंसिबिलिटी पॉइंट्स के कारण कैसल विंडसर पसंद करता हूं।

+1

+1 - अच्छा जवाब! मैं एकता का उपयोग करता हूं और पसंद करता हूं। – TrueWill

+1

+1 - अच्छा जवाब! –

+0

धन्यवाद दोस्तों। पिछले कुछ वर्षों में (वाह, मैंने इस जवाब को पोस्ट करने के 2 साल बाद) मैंने वास्तव में कैसल विंडसर से दूर जाना शुरू कर दिया है क्योंकि "अगर आप संकल्प () को कॉल करते हैं, तो आपको रिलीज (ऑब्जेक्ट)" वारिस "कॉल करना होगा यह एक बग नहीं है , लेकिन एक सुविधा "मुद्दा। इससे मेरे द्वारा लिखे गए ऐप्स में कई मेमोरी लीक हुई हैं। इसके बजाय, मैं वेबआरक्वेट्स के कस्टम प्रासंगिक प्रबंधन के साथ एमईएफ में जा रहा हूं। – eduncan911

4

यूनिटी एप्लिकेशन ब्लॉक dependency injection के लिए उपयोग किया जाता है। मुझे लगता है कि डि के लिए सबसे अच्छा सरल परिभाषा से this question

है जब आप जा सकते हैं और खुद के लिए फ्रिज से बाहर बातें मिलता है, आप समस्याओं का कारण बन सकता है। आप दरवाजा खोल सकते हैं, आपको कुछ माँ या डैडी मिल सकती है जो आपको नहीं चाहिए। हो सकता है कि आप ऐसी किसी चीज़ की तलाश भी कर रहे हों जो हमारे पास नहीं है या जो समाप्त हो गया है।

आपको क्या करना चाहिए, "मुझे दोपहर के भोजन के साथ पीने के लिए कुछ चाहिए" और फिर हम यह सुनिश्चित करेंगे कि आप खाने के लिए बैठे समय कुछ लेंगे।

एक उदाहरण के लिए

तो,

IUnityContainer container = new UnityContainer(); 
ILunch lunch = container.Resolve<ILunch>(); 
Console.WriteLine(lunch.Drink); 

यह Outputs "लेमोनेड" क्योंकि हम एक निर्भरता के रूप में Drink परिभाषित किया।

public class ILunch { 
    [Dependency] 
    public IDrink Drink { get; set; } 
} 

जहाँ तक व्यावहारिकता जाता है, निर्भरता इंजेक्शन आप अन्य वस्तुओं पर निर्भरता है और आप डेवलपर उन्हें मैन्युअल रूप से स्थापित करने के लिए नहीं करना चाहती जब वास्तव में महान है। यह इतना आसान है। यह मजाक करने के लिए भी महान है। सबसे अधिक इस्तेमाल किया जाने वाला उदाहरण मैं सोच सकता हूं कि मैं डेटा लेयर का उपयोग कर रहा हूं। कभी-कभी डेटाबेस तैयार नहीं होता है इसलिए विकास को रोकने के बजाय मेरे पास नकली परत है जो नकली डेटा देता है। डेटा ऑब्जेक्ट को DI के माध्यम से एक्सेस किया जाता है और नकली परत या वास्तविक परत तक पहुंचने वाली वस्तुओं को वापस करने के लिए कॉन्फ़िगर किया जा सकता है। इस उदाहरण में मैं लगभग डी कंटेनर का उपयोग कॉन्फ़िगर करने योग्य फैक्ट्री क्लास के रूप में कर रहा हूं। यूनिटी एमएसडीएन के कुछ और संसाधनों के लिए http://msdn.microsoft.com/en-us/library/cc468366.aspx है।

अन्य अच्छा डि फ़्रेमवर्क शामिल Spring.NET और Ninject