2011-08-16 10 views
7

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

एमवीसी वेब एप्लिकेशन में इसका उपयोग करने के लिए उपयोगी कहां है?

क्या कोई ओपन सोर्स Asp.Net Mvc प्रोजेक्ट है जो इंटरसेप्टर का उपयोग करता है?

Asp.net एमवीसी फिल्टर के साथ नियंत्रक के लिए पहले से ही एक प्रकार का इंटरसेप्टर का समर्थन करता है। इंटरसेप्टर के बजाय फिल्टर का उपयोग करना बेहतर है?

+1

मैं तुम्हें निर्भरता इंजेक्शन पर एक नज़र के रूप में यह कार्यक्षमता की तरह आप देख रहे हैं के लिए एक से अधिक बार शब्द का इस्तेमाल किया है कहेंगे। – thekip

+0

@ थेकिप - मुझे इसके बारे में पता है। तो मैंने इसके लिए आईओसी टैग जोड़ा। – AnyOne

+0

ऐसा लगता है कि आप [.NET पर AOP] की तलाश कर रहे हैं (http://www.sharpcrafters.com/aop.net)। –

उत्तर

0

मैं तुम्हें अपने निर्भरता इंजेक्शन लगाने के लिए एक अधिक सामान्य डि कंटेनर का उपयोग कहेंगे। यह न केवल आपके नियंत्रक में निर्भरता को इंजेक्ट करता है, यह उन निर्भरताओं की निर्भरता भी प्रदान करता है जिसके परिणामस्वरूप आपकी सभी निर्भर वस्तुओं का पूर्ण ऑब्जेक्ट ग्राफ़ होता है।

सामने अंत के लिए एक डि कंटेनर का उपयोग करना आपकी वापस अंत अधिक इकाई परीक्षण योग्य और loosly मिलकर बनाने के लिए अच्छा अवसरों लाता है।

+0

अरे आपने इंटरसेप्टर्स के बारे में कुछ भी नहीं कहा है ... – AnyOne

+0

मुझे किसी भी कार्यक्षमता से अवगत नहीं है जो एक इंटरसेप्टर डीआई कंटेनर के विपरीत नहीं दे सकता है? – thekip

+0

मैंने अपने प्रश्न में डी कंटेनरों के बिना इंटरसेप्टर्स के शुद्ध उपयोग का इरादा नहीं किया है। यह सिर्फ – AnyOne

5

अवरोधन कई बातों के लिए इस्तेमाल किया जा सकता - सबसे इस तरह के उपकरण, प्रवेश, लेखा परीक्षा, सुरक्षा, पैमाइश, आदि

आप don't need a DI Container to apply the concept रूप पार काटने चिंताओं संबोधित करने के लिए उल्लेखनीय है, लेकिन यह मदद करता है।

आप ASP.NET MVC फिल्टर का उपयोग लगभग एक ही प्रभाव को प्राप्त कर सकते हैं, लेकिन जब आप एक आम तौर पर पुन: प्रयोज्य कार्यान्वयन आवेदन कर सकते हैं क्यों MVC ढांचे के लिए अपने आप को विवश?

12

कहाँ/जब इंटरसेप्टर

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

if (!ModelState.IsValid) 
    return View(model); 

इस कोड है कि संभावित एक इंटरसेप्टर (शायद एक MVC फिल्टर करने के लिए ले जाया जा सकता है इस मामले में)। क्या फ़िल्टर लिखने और आवेदन करने की लागत इस डुप्लिकेट कोड की लागत से अधिक है? (कोड के 2 लाइनों का उपयोग करके नियंत्रक क्रियाओं की संख्या)। इस मामले में, शायद नहीं। जहां एक इंटरसेप्टर उपयोग करने का लाभ अधिक होता है वहाँ अन्य स्थितियों, हालांकि, कर रहे हैं।

यहाँ मैं कहाँ कोड दोहराव के इस प्रकार हो सकता है की कल्पना कुछ स्थितियों की एक सूची है, यानी गंध जैसे वे इंटरसेप्टर से फायदा हो सकता है परिदृश्यों कि:

  • इनपुट सत्यापन (ऊपर दर्शाया गया है)।
  • डीबग लॉगिंग। आप write an interceptor कर सकते हैं जो प्रत्येक विधि कॉल के प्रवेश और बाहर निकलें रिकॉर्ड करता है।
  • थ्रेड सिंक्रनाइज़ेशन। आपका प्रश्न वेब ऐप्स के बारे में है, लेकिन यदि आप एक एमवीपी स्टाइल व्यू के साथ एक विंडोज़ एप्लीकेशन विकसित कर रहे हैं, तो आप एक इंटरसेप्टर लागू कर सकते हैं जो सुनिश्चित करता है कि सभी विधि कॉल यूआई थ्रेड पर सिंक्रनाइज़ हो जाएं।
  • डेटाबेस लेनदेन। मेरी डेटाबेस लेनदेन कोड में से अधिकांश इस तरह दिखता है:

 

using (var transaction = Session.BeginTransaction()) 
{ 
    // ... do some work that is unique to this method ... 
    transaction.Commit(); 
} 
  • PropertyChanged घटना कार्यान्वयन। यह कोड आमतौर पर लिखने के लिए बहुत ही दोहराव और परेशान होता है। Sacha Barber has thoroughly explored how to automatically implement this event using various frameworks
  • सुरक्षा। आपके आवेदन में शायद कई विधियां हैं जिन्हें केवल कुछ उपयोगकर्ताओं तक ही सीमित किया जाना चाहिए। The AuthorizeAttribute बिल्कुल इस के लिए एक फ़िल्टर है।
  • वेब सेवा अनुरोध थ्रॉटलिंग। कुछ एपीआई, जैसे कि बेसकैम्प के लिए एपीआई, पूछें कि limit your requests किसी दिए गए समय सीमा के अनुरोधों की एक निश्चित संख्या में। यदि आपने बेसकैम्प क्लाइंट क्लास लिखा है, तो आप यह सुनिश्चित करने के लिए एक इंटरसेप्टर लागू कर सकते हैं कि सभी विधि कॉलों को Thread.Sleep का उपयोग करते हुए गति सीमा को सम्मानित किया जाए।
  • परिणाम कैशिंग परिणाम।MVC has some filters pre-built for this purpose। यूआई परत के नीचे परतों के परिणामों को कैश करने के लिए आप अपना स्वयं का इंटरसेप्टर लिख सकते हैं।
  • डब्ल्यूसीएफ त्रुटि प्रबंधन। यदि आप Faulted स्थिति में हैं तो Dispose एक डब्ल्यूसीएफ क्लाइंट नहीं हो सकता है, इसलिए क्लाइंट के एक उदाहरण को बनाने और नष्ट करने वाली प्रत्येक विधि को राज्य की जांच करने की आवश्यकता होती है, फिर Abort पर कॉल करें, यदि ग्राहक के चारों ओर using क्लॉज को बस लपेटने के बजाय आवश्यक हो। इस मामले में एक इंटरसेप्टर सबसे अच्छा फिट नहीं हो सकता है। यह शायद to just fix the Dispose implementation or use some kind of wrapper आसान है।

या नहीं, ऊपर के उदाहरण इंटरसेप्टर के लिए बेहतर साबित होगा आपके आवेदन की अनूठी पेचीदगियों पर निर्भर करता है। पाठ्यक्रम की यह सूची संपूर्ण नहीं है, न ही यह हो सकती है। इंटरसेप्टर के संभावित अनुप्रयोग आपके द्वारा लिखे गए अनुप्रयोगों के रूप में भिन्न होते हैं।

इंटरसेप्टर

मैं तीन प्राथमिक स्थानों के बारे में सोच सकते हैं का उपयोग कैसे करें, जहां आप एक इंटरसेप्टर लागू करने के लिए पसंद कर सकते हैं: नियंत्रक, सेवा, और डोमेन वस्तुओं।

  • एक MVC नियंत्रक के साथ, यह आगे जाना है और MVC's filters उपयोग करने के लिए सर्वाधिक महत्व रखता है।
  • एक मध्य स्तरीय सेवा है कि आप अपने आईओसी कंटेनर से बाहर निकलने हैं के लिए, फिल्टर एक विकल्प (क्योंकि यह एक नियंत्रक नहीं है) नहीं हैं, इसलिए आप interception features of your IoC container उपयोग करना चाहिए।
  • अपने डोमेन के लिए वस्तुओं है कि आप आमतौर पर या तो एक निर्माता के साथ सीधे का दृष्टांत (अगर यह एक नई इकाई है) या अपनी पसंद के ORM से ला नहीं (अगर यह मौजूदा इकाई है), आप किसी प्रकार का उपयोग करना होगा ऑब्जेक्ट फैक्टरी कन्स्ट्रक्टर के बजाय और instruct your ORM how to use the factory

इस सब को पूरा करने के तरीके के बारे में नाराज किरकिरा विवरण इस बात पर निर्भर करेगा कि आप किस टूल का उपयोग कर रहे हैं।

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