2010-09-19 13 views
9

हर बार जब मैं एक नए एएसपी.नेट एमवीसी वेब एप्लिकेशन पर काम करना शुरू करता हूं, तो मुझे यकीन नहीं है कि DataAnnotations सत्यापन का उपयोग करना है या नहीं। इसके बारे में कुछ गलत लगता है।डेटाअनोटेशन या सेवाओं में मैन्युअल रूप से मान्य करें?

उदाहरण के लिए, मान लें कि मेरे पास UserService है जो CreateAccountController की क्रिया से CreateUserModel पारित किया गया है। यह सुनिश्चित करने के लिए कि उपयोगकर्ता हमेशा एक नाम प्रदान करता है, मैंने [Required] विशेषता रखने के लिए मॉडल की Name संपत्ति सेट की है। अब मैं इस ज्ञान में सुरक्षित हूं कि मॉडल बाइंडर मुझे कभी भी CreateUserModel नहीं देगा जब तक कि इसका नाम न हो।

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

तो मेरा सवाल है: इस स्थिति के लिए सबसे अच्छा अभ्यास क्या है? डेटा एनोटेशन के साथ मान्य करें और सेवाओं में उस सत्यापन को दोहराएं? केवल सेवाओं में मान्य करें और अपवाद फेंक दें? दोनों का मिश्रण?

मुझे आशा है कि मेरा प्रश्न बहुत ही व्यक्तिपरक नहीं है, मैं मुख्य रूप से इस बात पर सर्वसम्मति स्थापित करने की कोशिश कर रहा हूं कि डेटा एनोटेशन के सत्यापन को अंत में मुझे समाप्त करने के लिए खत्म हो रहा है या नहीं।

उत्तर

1

आप सही हैं, आपको नियंत्रक पर सत्यापन अक्षम करना चाहिए और सेवा परत में मान्य होना चाहिए। यदि आप चाहें तो भी आप डेटा एन्नोटेशन का उपयोग कर सकते हैं। सेवा परत सत्यापन संदेशों के साथ अपवाद फेंक सकती है, नियंत्रक उस अपवाद को पकड़ सकता है और मॉडलस्टेट में सत्यापन संदेश जोड़ सकता है। आप नियंत्रक की ऑनएक्सप्शन विधि पर सत्यापन अपवाद को संभालने के द्वारा प्रत्येक क्रिया के लिए ऐसा करने से बच सकते हैं।

1

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

6

मैन्युअल सत्यापन (यदि x == y) और डेटा एनोटेशन का उपयोग करके मैं सेवा परत में अपनी सभी सत्यापन करता हूं।

अपनी सेवा परत में डेटा एनोटेशन का उपयोग करने के लिए, आपको TryValidateObject() विधि का उपयोग करके मैन्युअल रूप से Validator कक्षा का उपयोग करना होगा। इसका एक अच्छा उदाहरण here देखा जा सकता है।

आपको फिर अपनी सेवा परत से अपनी नियंत्रक त्रुटियों को अपने नियंत्रक से पास करना होगा, और आपका नियंत्रक प्रत्येक त्रुटि को मॉडल स्थिति त्रुटि सूची में जोड़ देगा।

+1

यह वही है जो हम करते हैं, सिवाय इसके कि हम एक सीवीस परत को IVIIalidationDictionary पास करते हैं जिसे मॉडलस्टेट रैपर के रूप में कार्यान्वित किया जाता है, इसलिए सेवा परत सीधे मॉडलस्टेट में त्रुटियों को जोड़ने में सक्षम है लेकिन एएसपी.नेट एमवीसी पर निर्भरता के बिना। नियंत्रक को फिर मॉडलस्टेट में लौटाई गई त्रुटियों को जोड़ने के प्रबंधन के बारे में चिंता करने की आवश्यकता नहीं है। –

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