नियंत्रण
एक त्वरित योग के उलट (बहुत अधिक पढ़ने इस विषय उपलब्ध है, और मैं अत्यधिक अधिक पढ़ने का सुझाव) ...
एंटरप्राइज़ पैटर्न और प्रैक्टिस टीम से माइक्रोसॉफ्ट की एकता नियंत्रण कंटेनर प्रोजेक्ट का एक उलटा है, या आईओसी संक्षिप्त है। कैसल विंडसर, स्ट्रक्चर मैप इत्यादि की तरह। इस प्रकार के विकास को लैमेन के शब्दों में भी आपके घटकों को लूपली के रूप में संदर्भित किया जाता है।
आईओसी में आपकी ऑब्जेक्ट्स की निर्भरता इंजेक्शन के लिए एक पैटर्न शामिल है, जिसमें आप अपनी वस्तुओं के भीतर निर्भरताओं को तारित करने के लिए बाहरी घटक पर भरोसा करते हैं।
उदाहरण के लिए, स्थिर प्रबंधकों (जो इकाई परीक्षण के लिए असंभव हैं) तक पहुंचने के बजाय, आप एक ऐसी वस्तु बनाते हैं जो कार्य करने के लिए बाहरी निर्भरता पर निर्भर करता है। आइए एक पोस्ट सेवा लें जिसमें आप पोस्ट प्राप्त करने के लिए डीबी तक पहुंचना चाहते हैं।
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 - अच्छा जवाब! मैं एकता का उपयोग करता हूं और पसंद करता हूं। – TrueWill
+1 - अच्छा जवाब! –
धन्यवाद दोस्तों। पिछले कुछ वर्षों में (वाह, मैंने इस जवाब को पोस्ट करने के 2 साल बाद) मैंने वास्तव में कैसल विंडसर से दूर जाना शुरू कर दिया है क्योंकि "अगर आप संकल्प() को कॉल करते हैं, तो आपको रिलीज (ऑब्जेक्ट)" वारिस "कॉल करना होगा यह एक बग नहीं है , लेकिन एक सुविधा "मुद्दा। इससे मेरे द्वारा लिखे गए ऐप्स में कई मेमोरी लीक हुई हैं। इसके बजाय, मैं वेबआरक्वेट्स के कस्टम प्रासंगिक प्रबंधन के साथ एमईएफ में जा रहा हूं। –
eduncan911