.Net में AOP के लिए सबसे अच्छा कार्यान्वयन क्या है? [बन्द है]


83

C #, VB.net में बहुत AOP कार्यान्वयन है। यह कुछ एओपी कार्यान्वयन है:

.Net में AOP के लिए सबसे अच्छा कार्यान्वयन क्या है? मुझे क्या उपयोग करना चाहिए?


4
यह उपयोगी होगा यदि आप सभी AOP को लिंक प्रदान करते हैं, ताकि Google के साथ पाठक को थोड़ा समय बचा रहे। मैं उम्मीद कर रहा हूँ कि यह प्रश्न / उत्तर .NET में विभिन्न AOP विकल्पों का एक बड़ा सारांश बन जाएगा
Ian Ringrose

10
52 लोगों ने मतदान किया यह एक रचनात्मक प्रश्न है। 5 ने वोट दिया यह रचनात्मक नहीं है। किसने तय किया? कम से कम मध्यस्थ को प्रश्न को बदलना या सुधारना चाहिए, लेकिन वे ज्यादातर लोगों की राय पर विचार करना बेहतर समझते हैं।
स्पष्ट

2
@ स्पष्ट रूप से सहमत हूँ!
महापुरूष

1
यह आश्चर्यजनक है कि एसओ और लोग ओटी के रूप में इस तरह के सवालों को कम करते हैं। इस तरह के एक उपयोगी सवाल और चर्चा करने के लिए तकनीक और समुदाय को बस वोट दिया जाता है और पुराने जमाने के बंद, लेकिन 80 के दशक के स्टाइल के लोग जो अतीत में फंस गए हैं। एसओ, दुनिया बदल गई है। यह पूरी तरह से समझा जा सकता है कि आप asnwer विशिष्ट प्रश्नों में मदद करना चाहते हैं, लेकिन कम से कम अपने "बंद" टैग में एक लिंक प्रदान करें जहां इस तरह के प्रश्न पोस्ट करने हैं। इससे बहुत मदद मिलेगी और इस तरह की मूर्खता से बचा जा सकेगा।
पिक्सेल

जवाबों:


45

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

यदि डायनेमिक इंटरसेप्शन आपकी ज़रूरतों को पूरा नहीं कर सकता (सीलिंग क्लास बुनाई, गैर-वर्चुअल कॉल आदि को रोकना), तो आप निश्चित रूप से स्टेटिक वेटिंग चाहते हैं। PostSharp इस डोमेन में संदर्भ है।

ध्यान दें कि यह लिनफू भी मौजूद है , जिसका उपयोग दोनों एओपी फैशन का लाभ उठाने के लिए किया जा सकता है।


3
उस पर +1 करें यदि आप रनटाइम एओपी करना चाहते हैं। यदि आप पोस्ट-संकलन समय AOP चाहते हैं, तो PostSharp पर +1
Kzysztof Kozmic

इस उत्तर पर कोई अपडेट? या यह अभी भी वैध है? मैं विशेष रूप से सोच रहा था कि कैसे स्प्रिंग। कैसल और पोस्टशेयर की तुलना करता है
एरेन कुज़ुकोग्लू

1
दुर्भाग्य से, PostSharp एक व्यावसायिक उत्पाद है
पिक्सेल

Postharp वाणिज्यिक उत्पाद है, मुफ्त नहीं। स्थिर बुनाई के लिए कृपया कुछ और सलाह दें।
शिवम सचान

@ शिवमचन केवल इसलिए कि कुछ मुफ्त है, यह अच्छा नहीं है। सबसे मुफ्त में AOP .net पिछले 2-5 साल पहले अद्यतन के साथ मृत्यु हो गई, PostSharp अभी भी कक्षा में सर्वश्रेष्ठ है।
12

15

"सर्वश्रेष्ठ" व्यक्तिपरक है।

सबसे पहले, उन विशेषताओं की एक सूची तैयार करें जिनकी आपको ज़रूरत है, आपकी वास्तुकला आदि, फिर उन विकल्पों की तलाश करें, जो आपको आवश्यक हैं, बिना अनावश्यक जटिलता का परिचय दिए। उदाहरण के लिए, कई इंटरफ़ेस उन्मुख हैं: क्या आपका कोड वर्तमान में इंटरफ़ेस उन्मुख है? यदि नहीं, तो PostSharp एक बेहतर विकल्प हो सकता है (मूल वर्गों में बुना जा सकता है)। लेकिन बेशक, PostSharp रनटाइम पर कॉन्फ़िगर नहीं किया जा सकता ... पाठ्यक्रमों के लिए घोड़े।


आप इस प्रकार बता सकते हैं कि आपने जो कहा वह इस प्रकार है: "सर्वश्रेष्ठ व्यक्तिपरक है, मैं इस रूपरेखा के लिए प्रो और कंट्रोस की सूची तैयार करूंगा"।
स्पष्ट

11

.NET में पहलू-उन्मुख प्रोग्रामिंग करने का सबसे अच्छा तरीका अच्छी तरह से ज्ञात डिजाइन तकनीकों का उपयोग करना है। उदाहरण के लिए, एसओएलआईडी सिद्धांतों को लागू करके आप क्रॉस-कटिंग चिंताओं को जोड़ने की अनुमति देने के लिए लचीलापन और मॉड्यूलरिटी प्राप्त कर सकते हैं। यदि आपके पास डिज़ाइन सही है, तो आप बिना किसी ढांचे के सबसे अधिक क्रॉस-कटिंग चिंताओं को लागू करने में सक्षम होंगे। यह सोचना एक पतन है कि ओओपी AOP करने के लिए अनुपयुक्त है।

यहाँ कुछ संकेत दिए गए हैं:

  • ठोस उदाहरणों पर निर्भर न हों, बल्कि सार पर निर्भर रहें।
  • एक ही कक्षा में क्रॉस-कटिंग चिंताओं और व्यावसायिक तर्क को न मिलाएं।
  • उन चिंताओं ( सज्जाकार ) को लागू करने वाली कक्षाओं में व्यावसायिक तर्क के साथ कक्षाएं लपेटकर क्रॉस-कटिंग चिंताओं को जोड़ना ।
  • अपने डिजाइन में सामान्य कलाकृतियों को ढूंढें और उन्हें समान रूप से मॉडल करें, अधिमानतः एक ही प्रकार के अमूर्त का उपयोग करके। उदाहरण के लिए इस और इस पर एक नज़र डालें ।

जब आपको सही सार मिल गया है, तो सिस्टम में नई क्रॉस-कटिंग चिंताओं को जोड़ना एक नए डेकोरेटर वर्ग को लिखने और इसे सही कार्यान्वयन के आसपास लपेटने का मामला है। यदि सार सामान्य हैं, तो आप कक्षाओं के एक बड़े समूह के चारों ओर एक एकल डेकोरेटर लपेट सकते हैं (जो कि एओपी के बारे में ठीक है)।

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


एओपी अमूर्तन का अगला स्तर है। वास्तव में, यह विरासत और संरचना की सीमा है जो AOP की ओर ले जाती है। क्या आपने एंटलीब अपवाद ब्लॉक देखा है? पहलू, डेटाबेस में हर एक कॉल के लिए लानत ब्लॉक की तुलना में बहुत अधिक क्लीनर है, बस कोशिश-कैच-लॉग-थ्रो के लिए।
स्लीपर स्मिथ

2
यदि आप अपवाद कॉल के साथ अपने डेटाबेस में हर कॉल को लपेटते हैं, तो आप इसे वैसे भी गलत कर रहे हैं। यह अच्छे डिजाइन में वापस आता है। हमेशा।
स्टीवन

तो इसके बजाय db अपवादों को पकड़ने का सही तरीका क्या है?
OutOouchouch

2
@OutOFTouch: इस SO प्रश्न के उत्तर पर एक नज़र डालें ।
स्टीवन

2
@ स्लीपरस्मिथ: हालांकि मुझे यकीन नहीं है कि "एओपी एब्सट्रैक्शन का अगला स्तर है" का मतलब है, मुझे लगता है कि आप एओपी के उपयोग के बिना बड़े सिस्टम को बनाए नहीं रख सकते। मुझे AOP लगाने में विश्वास है। हालाँकि, AOP एक प्रतिमान है; एक उपकरण नहीं है। मैं विरासत की सीमा से सहमत हूं, लेकिन यह रचना की सीमा नहीं है जो AOP की ओर ले जाती है। यह उचित डिजाइन की कमी है जो कोड बुनाई और गतिशील प्रॉक्सी टूल का उपयोग करता है। मैं सज्जाकारों का उपयोग करके क्रॉस-कटिंग चिंताओं को लागू करता हूं। यह AOP लगाने का मेरा पसंदीदा तरीका है।
स्टीवन

5

मैं सर्वश्रेष्ठ के बारे में नहीं जानता, बहुत सारे ढांचे हैं और उन सभी को आजमाने के लिए दिन में पर्याप्त घंटे नहीं हैं।

मैंने PostSharp का उपयोग किया और सुखद आश्चर्य हुआ कि इसके साथ शुरुआत करना कितना आसान है।

मैंने कैसल विंडसर और स्प्रिंग.नेट के साथ एओपी में भी देखा, दृष्टिकोण अलग है (रनटाइम बनाम संकलन समय)। AOP और IoC को मिलाना समझ में आता है। जब आप इनमें से किसी एक फ्रेमवर्क का उपयोग नहीं कर रहे होते हैं तब भी इसे शुरू करना बहुत अधिक काम होता है, लेकिन इसे रोकना नहीं चाहिए।

नई परियोजनाओं के लिए अब मैं शायद कैसल विंडसर का उपयोग करूंगा, लेकिन ऐसा इसलिए है क्योंकि मैं भी आईओसी का उपयोग करना चाहता हूं। अगर मुझे AOP को एक मौजूदा कोड बेस पर जल्दी लागू करना होता तो मैं PostSharp का उपयोग करता।


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.