उम्मीद है कि आप नीचे दी गई परिदृश्य में बताई गई समस्या को देखेंगे। यदि यह स्पष्ट नहीं है, तो कृपया मुझे बताएं।आप अपना सत्यापन कहां करते हैं?
आप एक आवेदन है कि तीन स्तरों में टूट गया है मिल गया है,
- सामने के छोर यूआई परत, asp.net वेबफ़ॉर्म, या खिड़की (संपादन व्यक्ति डेटा के लिए प्रयोग)
- मध्य स्तरीय व्यापार सेवा हो सकता है परत, एक dll में संकलित (PersonServices)
- डेटा का उपयोग परत, एक dll (PersonRepository)
में संकलित मेरे सामने अंत में, मैं एक नया व्यक्ति वस्तु बनाना चाहते हैं, कुछ properti सेट ईएस, जैसे कि फर्स्टनाम, अंतिम नाम यूआई में यूआई में दर्ज किया गया है, और पर्सन सर्विसेज को कॉल करें। एडपर्सन, नव निर्मित व्यक्ति को पास कर रहा है। (एडपर्सन को स्थिर होना जरूरी नहीं है, यह सिर्फ सादगी के लिए है, किसी भी मामले में एडपर्सन अंततः रिपोजिटरी के एडपर्सन को कॉल करेगा, जो तब डेटा को जारी रखेगा।)
अब मैं जो हिस्सा सुनना चाहता हूं सत्यापन पर विचार है। लाइन के साथ कहीं, उस नव निर्मित व्यक्ति को सत्यापित करने की आवश्यकता है। आप इसे क्लाइंट साइड पर कर सकते हैं, जो आसान होगा, लेकिन अगर मैं अपने पर्सन सर्विसेज में व्यक्ति को मान्य करना चाहता हूं। एडपर्सन विधि। यह सुनिश्चित करेगा कि मैं जिस भी व्यक्ति को सहेजना चाहता हूं उसे सत्यापित किया जाएगा और यूआई परत पर काम करने पर निर्भरता को हटा दिया जाएगा। या शायद, यूआई में और व्यापार सर्वर परत दोनों में मान्य करें। अभी तक अच्छा लगता है?
तो, सादगी के लिए, मैं निम्नलिखित सत्यापन जांच प्रदर्शन करने के लिए PersonService.AddPerson विधि को अपडेट कर देंगे - देखें कि क्या प्रथम नाम और अंतिम नाम खाली नहीं हैं - इस नए व्यक्ति पहले से ही अपने भंडार में मौजूद नहीं है सुनिश्चित करें
और यह विधि सही हो जाएगी यदि सभी सत्यापन पास हो जाते हैं और व्यक्ति जारी रहता है, तो गलत होने पर वैधता विफल होती है या यदि व्यक्ति जारी नहीं रहता है।
लेकिन यह बूलियन मान जो यूपी परत पर मेरे लिए पर्याप्त नहीं है, उपयोगकर्ता को एक स्पष्ट कारण देने के लिए कि सहेजने की प्रक्रिया विफल क्यों हुई। तो एक अकेला डेवलपर क्या करना है? आखिरकार, मैं एडपर्सन विधि को यह सुनिश्चित करने में सक्षम होना चाहता हूं कि इसे सहेजने के बारे में क्या मान्य है, और यदि नहीं, तो कारणों से संवाद करने में सक्षम होना चाहिए कि यह मेरी यूआई परत में क्यों अमान्य नहीं है।
बस अपने रस बहने के लिए, यह हल करने के कुछ तरीके हो सकते हैं: (इनमें से कुछ समाधान, मेरी राय में, चूसते हैं, लेकिन मैं उन्हें वहां डाल रहा हूं ताकि आप जो भी कोशिश कर रहे हैं उसे समझ सकें हल करने के लिए)
- इसके बजाय AddPerson एक बूलियन लौटने का
, यह एक पूर्णांक लौट सकते हैं (यानी 0 = सफलता, गैर शून्य विफलता के बराबर होती है और संख्या का कारण यह दर्शाता क्यों यह असफल।
AddPerson में, सत्यापन विफल होने पर कस्टम अपवाद फेंक दें। प्रत्येक प्रकार के कस्टम अपवाद का अपना त्रुटि संदेश होगा। इसके अलावा, प्रत्येक कस्टम अपवाद डब्ल्यू पर्याप्त अद्वितीय यूआई परत में पकड़ने के लिए हो ould
Have AddPerson का संकेत सत्यापन पारित कर दिया या असफल है कि क्या गुण होता है कि कस्टम वर्ग के कुछ प्रकार वापसी, और अगर यह असफल क्यों हुआ, कारणों
नहीं हैं कि क्या थे सुनिश्चित करें कि यह वीबी या सी # में किया जा सकता है, लेकिन व्यक्ति और उसके अंतर्निहित गुणों को किसी प्रकार की संपत्ति संलग्न करें।यह "संलग्न" संपत्ति बातें सत्यापन की जानकारी
की तरह हो सकता है एक और यहाँ घना प्रश्न के लिए
क्षमा याचना को रख सकती अपने विचार या यहाँ पैटर्न
डालें और, लेकिन मैं निश्चित रूप से इस पर आपकी राय सुनना पसंद करता हूं।
धन्यवाद!
टेस्टेबिलिटी के बारे में क्या? एक असंकृत उदाहरण पर विचार करें, जो एक एक असंबंधित ऐप में मैंने जो देखा था उसका ओवरम्प्लीफाइड संस्करण है। "शॉपिंग.com" उनकी वेबसाइट पर उनके आंतरिक वेब ऐप "जेनी" के साथ कूपन/प्रोमो बनाता है। सबसे कम प्रोमो जीनी बना सकता है प्रकाशित होने के 6 घंटे बाद वैध होगा। एक प्रोमो बनाने के लिए (प्रकाशित नहीं) बनाने के लिए, जीनी एक एपीआई कॉल करता है जो बैकएंड के लिए अन्य चीजों के साथ expiryDateTime, भेजता है। ध्यान दें कि 6 घंटे के व्यवसाय नियम कुछ अच्छे कारणों से बदला नहीं जा सकता ..... (अगली टिप्पणी देखें।) – testerjoe2
जीनी में, हम टेस्ट करना चाहते हैं यदि प्रोमो के दौरान एक संदेश बॉक्स दिखाया जाता है। मैंने परीक्षण पर प्रभाव के बारे में सोचा जब हम प्रोमोस बनाने के लिए नीचे दिए गए दो डिज़ाइन दृष्टिकोणों का उपयोग करते हैं - *** एक *** - यूआई जांच करता है कि समाप्ति दिनांक वर्तमान समय से कम से कम 6 घंटे या उससे अधिक है और एक महीने से भी कम दूर है । इसके बाद, बैकएंड करने के लिए समाप्ति तिथि समाप्त हो जाती है। - बैकएंड केवल तभी जांचता है जब समाप्ति दिनांक वर्तमान समय और एक महीने के बीच है। *** TWO *** - बैकएंड चेक करता है कि क्या समाप्ति तिथि अब और एक महीने से 6 घंटे के बीच है ..... (अगली टिप्पणी देखें।) – testerjoe2
दो दृष्टिकोणों में परीक्षण - *** एक ** * - वर्तमान समय से कुछ मिनट तक expiryDateTime सेट करने के लिए बैकएंड करने के लिए एपीआई कॉल का उपयोग करें। *** TWO *** - बैकएंड को एपीआई कॉल भेजें और समाप्ति का परीक्षण करने के लिए 6 घंटे तक प्रतीक्षा करें। वैकल्पिक रूप से, डेटाबेस परत को सीधे दबाएं और इसकी अनुमति होने पर समाप्ति दिनांक समय बदलें। – testerjoe2