46

मार्क सेमैन द्वारा "Dependency Injection in .NET" पढ़ने के बाद मैं Service Locator से दूर रहूंगा जो एक विरोधी पैटर्न है।सेवा लोकेटर एंटी-पैटर्न का उपयोग कर एमवीसी 4 क्यों है?

the release notes on MVC 4 पढ़ने पर मैं देख रहा हूँ:

नियंत्रण (आईओसी) DependencyResolver के माध्यम से की बेहतर उलट: वेब एपीआई अब सेवा लोकेटर पैटर्न MVC की निर्भरता समाधानकर्ता द्वारा कार्यान्वित कई अलग अलग सुविधाओं के लिए उदाहरणों प्राप्त करने के लिए उपयोग करता है।

इस प्रकार मैं उत्सुक छोड़ रहा हूँ और उलझन में क्यों माइक्रोसॉफ्ट 2012

उत्तर

50

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

इस प्रकार मैं क्यों माइक्रोसॉफ्ट 2012.

में एक सेवा लोकेटर का प्रयोग करेंगे क्योंकि एक रूपरेखा डिजाइनिंग एक रूपरेखा का उपयोग कर एक आवेदन को डिजाइन करने के समान नहीं है उत्सुक और उलझन में छोड़ दिया हूँ। किताबों में जो कुछ लिखा है, उसके बजाए एएसपी.नेट एमवीसी जैसे पुन: प्रयोज्य ढांचे को डिजाइन करते समय कुछ अलग-अलग चीजों को ध्यान में रखना है। कुछ उदाहरण ढांचे को इस तरह से डिजाइन करना है कि इस ढांचे का उपयोग करने वाले व्यक्ति इस ढांचे का उपयोग करके पुस्तकों में लिखे गए सर्वोत्तम अभ्यासों का लाभ उठा सकेंगे।

+9

+1 फ्रेमवर्क अनुप्रयोगों की तुलना में विभिन्न नियमों का पालन करते हैं।आप एक ढांचा कंटेनर अज्ञेयवादी रखना चाहते हैं (यदि कोई ऐसा अनुप्रयोग जो फ्रेमवर्क का उपयोग करना चाहता है, पहले से ही एक अलग कंटेनर का उपयोग करता है) और आप आमतौर पर उन अनुप्रयोगों पर DI के उपयोग को लागू नहीं करना चाहते हैं (क्योंकि वे DI का उपयोग नहीं करना चाहते हैं बिलकुल)। –

+23

मैं तर्क नहीं खरीदता कि सिर्फ इसलिए कि यह एक ढांचा है, एक सेवा लोकेटर उपयुक्त है। हां, ढांचे अनुप्रयोगों से अलग हैं, लेकिन सर्विस लोकेटर का उपयोग किए बिना ढांचे को लिखना पूरी तरह से संभव है। बस एएसपी.नेट एमवीसी 1 और 2, या डब्ल्यूसीएफ के रूप में जटिल कुछ भी देखें। एएसपी.नेट एमवीसी 3+ में निर्भरता रीसोलवर के साथ समस्या यह है कि यह केवल एक आंतरिक कार्यान्वयन विस्तार नहीं है बल्कि बल्कि 'डी सपोर्ट' के रूप में प्रकाशित और प्रकाशित किया जा रहा है। –

+0

@MarkSeemann मैंने इस चर्चा को एक बड़े उद्यम ढांचे के मुख्य वास्तुकार के साथ किया था। यदि आप मुझे बता सकते हैं कि इस तरह के ढांचे के कंटेनर को अज्ञात बनाने के लिए और उस ढांचे का उपयोग करके लिखे गए सभी अनुप्रयोगों पर डी पैटर्न को लागू नहीं किया जाए तो मैं उन्हें सुनकर खुश रहूंगा। –

35

जैसा कि डारिन बताते हैं, एएसपी.नेट एमवीसी 4 एक फ्रेमवर्क है और कंटेनर अज्ञेयवादी है। यही कारण है कि यह IDependencyResolver के रूप में एक सेवा लोकेटर प्रदान करता है। यह किसी को भी अपनी पसंद के कंटेनर में प्लग करने की अनुमति देता है।

हालांकि, मैं इसे एक विरोधी पैटर्न नहीं कहूंगा। यह आपको अपनी पसंद के कंटेनर का उपयोग करने की अनुमति देता है, लेकिन यह को सेवा स्थान का उपयोग करने के लिए एप्लिकेशन डेवलपर को मजबूर नहीं करता है। यदि ढांचे ने डेवलपर को सेवा स्थान का उपयोग करने के लिए मजबूर किया, तो मैं इसे एक विरोधी पैटर्न कहूंगा। लेकिन डेवलपर जो एएसपी.नेट एमवीसी एप्लीकेशन बनाता है वह कन्स्ट्रक्टर इंजेक्शन, प्रॉपर्टी सेटअप या सर्विस लोकेशन के माध्यम से डी का उपयोग करने के लिए स्वतंत्र है। यह उनकी पसंद है।

मेरे द्वारा या एएसपी.नेट एमवीसी टीम द्वारा प्रकाशित निर्भरता इंजेक्शन के सभी एएसपी.नेट एमवीसी उदाहरण देखें। बहुत सारे मामलों में, वे कन्स्ट्रक्टर इंजेक्शन का उपयोग कर रहे हैं। वे सेवा स्थान का उपयोग नहीं कर रहे हैं।

वास्तव में, अधिकांश एएसपी.नेट एमवीसी स्रोत कोड स्वयं निर्भरताओं को पुनर्प्राप्त करने के लिए सेवा स्थान का उपयोग नहीं करता है। कुछ प्रमुख स्थान हैं जहां एमवीसी विरासत एपीआई और ऐसे के लिए सेवा लोकेटर में कॉल करता है। इसके बारे में बस इतना ही।

+3

यह उचित लगता है, मैं अभी भी सोच रहा हूं कि मुझे यह प्रतिक्रिया मार्सीन डोबोस (http://blogs.msdn.com/b/marcinon/) से एक ईमेल में मिली है, जिसमें मुझे मार्क की पुस्तक/और सेवा लोकेटर के बारे में बताया गया है एक विरोधी पैटर्न ने कहा: "मैंने पुस्तक नहीं पढ़ी है, इसलिए मैं इस तर्क से परिचित नहीं हूं कि यह एक विरोधी पैटर्न क्यों है। क्या आप स्पष्ट कर सकते हैं कि आपको ऐसा क्यों लगता है कि यह एक खराब डिजाइन है?" –

+3

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

+0

आपने कहा: "मेरे द्वारा या एएसपी.नेट एमवीसी टीम द्वारा प्रकाशित निर्भरता इंजेक्शन के सभी एएसपी.नेट एमवीसी उदाहरण देखें।" क्या आप सुझाए गए कुछ लोगों के लिंक प्रदान कर सकते हैं? मेरे पास कुछ सेवा संदर्भ हैं जो मेरे कई नियंत्रक उपयोग करते हैं। उन्हें एक ऑब्जेक्ट मिलता है, जिसे मॉडल बनाने के लिए कुछ काम करने के लिए मॉडल ऑब्जेक्ट (कन्स्ट्रक्टर या विधि) प्रदान किया जाता है (व्यू मॉडेल यदि आप करेंगे) जो दृश्य को प्रदान किया जाता है। आईओसी करना चाहते हैं मेरा मुख्य कारण मेरी टेस्ट प्रोजेक्ट से है, मैं कुछ और प्रदान करने में सक्षम होना चाहता हूं जो सर्विस रिफरेंस से आईएस सेवा लागू करता है/वास्तव में मेरी टेस्ट प्रोजेक्ट से सेवा को कॉल करता है। – DaveH

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