जितनी जल्दी हो सके वैधता का प्रदर्शन किया जाना चाहिए।
किसी भी संदर्भ में मान्यता, या तो डोमेन मॉडल या सॉफ्टवेयर लिखने का कोई अन्य तरीका, आपको उस समय क्या करना है और किस स्तर पर आप इसे करना चाहते हैं, इस उद्देश्य की पूर्ति करनी चाहिए।
आपके प्रश्न के आधार पर, मुझे लगता है कि उत्तर सत्यापन को विभाजित करने के लिए होगा।
संपत्ति सत्यापन जाँच करता है कि उस संपत्ति के लिए मूल्य सही है जैसे कि जब 1-10 के बीच की सीमा समाप्त हो जाती है।
ऑब्जेक्ट सत्यापन की गारंटी है कि ऑब्जेक्ट पर सभी गुण एक दूसरे के साथ संयोजन के रूप में मान्य हैं। जैसे EndDate EndDate से पहले है। मान लीजिए कि आपने डेटा स्टोर से एक मान पढ़ा है और डिफ़ॉल्ट रूप से BeginDate और EndDate दोनों आरंभिक हैं। बिग्रेड सेट करते समय, "एंडडेट से पहले होना चाहिए" नियम को लागू करने का कोई कारण नहीं है, क्योंकि यह वाईईटी लागू नहीं करता है। इस नियम की जांच होनी चाहिए कि सभी संपत्तियों को निर्धारित किया गया है। इसे कुल रूट स्तर पर कहा जा सकता है
मान्यता भी कुल (या कुल मूल) इकाई पर पूर्ववर्ती होनी चाहिए। ऑर्डर ऑब्जेक्ट में वैध डेटा हो सकता है और इसलिए यह ऑर्डरलाइन है। लेकिन तब एक व्यापार नियम कहता है कि कोई भी आदेश $ 1,000 से अधिक नहीं हो सकता है। आप इस नियम को कुछ मामलों में कैसे लागू करेंगे, यह आईएस ने अनुमति दी है। आप सिर्फ एक "राशि को मान्य नहीं कर सकते हैं" संपत्ति को नहीं जोड़ सकते क्योंकि इससे दुरुपयोग (जल्दी या बाद में, शायद आप भी, बस इस "बुरा अनुरोध" को पाने के लिए हो सकता है)।
अगले प्रस्तुति परत पर सत्यापन है। क्या आप नेटवर्क पर वस्तु भेजने के लिए वास्तव में जा रहे हैं, यह जानते हुए कि यह विफल हो जाएगा? या क्या आप उपयोगकर्ता को इस बर्डन को छोड़ देंगे और जैसे ही वह एक अमान्य मूल्य दर्ज करता है, उसे सूचित कर देगा। उदाहरण के लिए, जब आपका DEV वातावरण उत्पादन की तुलना में धीमा हो जाएगा तो अधिकांश समय। क्या आप "अभी तक ANOTHER टेस्ट चलाने के दौरान आप इस क्षेत्र को भूल गए हैं" के बारे में सूचित करने से पहले आप 30sec की प्रतीक्षा करना चाहेंगे, खासकर जब आपके बॉस द्वारा आपकी गर्दन को सांस लेने के साथ उत्पादन बग तय किया जाना है?
दृढ़ता के स्तर पर वैधता को यथासंभव संपत्ति मूल्य सत्यापन के करीब माना जाता है। यह किसी भी प्रकार या सादे पुराने डेटा पाठकों के मैपर्स का उपयोग करते समय "अशक्त" या "अमान्य मान" त्रुटियों को पढ़ने के साथ अपवादों को रोकने में मदद करेगा। संग्रहीत प्रक्रियाओं का उपयोग करने से यह समस्या हल हो जाती है, लेकिन उसी वैल्यूएशन लॉजिक को फिर से लिखना होगा और इसे AGAIN निष्पादित करना होगा। और संग्रहीत कार्यविधियाँ डीबी एडमिन डोमेन हैं, इसलिए एचआईएस जॉब करने की कोशिश न करें (या उसे इस "नट्टी पिकिंग जिसके लिए उसे भुगतान नहीं मिल रहा है" के साथ परेशान करें।
इसलिए इसे कुछ प्रसिद्ध शब्दों के साथ "यह निर्भर करता है" बताने के लिए, लेकिन अब आप जानते हैं कि यह क्यों निर्भर करता है।
काश मैं यह सब एक ही जगह पर कर सकता, लेकिन दुर्भाग्य से, यह नहीं किया जा सकता है। ऐसा करने से "भगवान वस्तु" पर एक निर्भरता होगी जिसमें सभी परतों के लिए सभी सत्यापन शामिल हैं। आप उस अंधेरे रास्ते से नीचे नहीं जाना चाहते हैं।
इस कारण से मैं केवल एक संपत्ति स्तर के अपवाद को फेंक देता हूं। अन्य सभी स्तरों पर मैं सभी "टूटे हुए नियमों" को इकट्ठा करने के लिए एक एकल विधि के साथ ValidationResult का उपयोग करता हूं और उन्हें एक एकल एग्रीगेटएक्स अपवाद में उपयोगकर्ता को पास करता हूं।
जब कॉल स्टैक को प्रचारित किया जाता है, तो मैं तब तक AggregateException में इन्हें फिर से इकट्ठा करता हूं जब तक कि मैं प्रस्तुति परत तक नहीं पहुंच जाता। सेवा परत WCF के मामले में क्लाइंट के लिए इस अपवाद को सीधे FaultException के रूप में फेंक सकती है।
यह मुझे अपवाद लेने की अनुमति देता है और या तो प्रत्येक इनपुट नियंत्रण पर अलग-अलग त्रुटियों को दिखाने के लिए इसे विभाजित करता है या इसे समतल करता है और इसे एक सूची में दिखाता है। चुनना आपको है।
यही कारण है कि मैंने प्रस्तुति सत्यापन का भी उल्लेख किया, जितना संभव हो सके शॉर्ट सर्किट के लिए।
यदि आप सोच रहे हैं कि मेरे पास एकत्रीकरण स्तर (या सेवा स्तर यदि आपको पसंद है) पर मान्यता क्यों है, तो यह इसलिए है क्योंकि मेरे पास यह बताने के लिए क्रिस्टल बॉल नहीं है कि भविष्य में मेरी सेवाओं का उपयोग कौन करेगा। आपको अपनी गलतियों को ढूंढने में बहुत परेशानी होगी, दूसरों को वहाँ गलतियाँ करने से रोकने के लिए :) अवैध डेटा इनपुट करके। आप आवेदन ए का प्रशासन करते हैं, लेकिन आवेदन बी आपकी सेवा का उपयोग करके कुछ डेटा खिलाता है। लगता है कि जब वे बग पूछना चाहते हैं, तो वे पहले कौन हैं? एप्लिकेशन बी के व्यवस्थापक को उपयोगकर्ता को खुशी से सूचित करना होगा "मेरे अंत में कोई त्रुटि नहीं है, मैं सिर्फ डेटा में फ़ीड करता हूं"।