7

मैं एक समान पोस्ट के लिए स्टैक ओवरव्लो पर चारों ओर देख रहा हूं और हां, मैं पूछने के बारे में कुछ चर्चाएं कर रहा हूं लेकिन मैंने एक नया विषय शुरू करने का फैसला किया।डीडीडी और क्लाइंट-साइड सत्यापन

मान लें कि आपके पास एक ऐसा एप्लिकेशन है जो डोमेन-मॉडल पैटर्न, डीडीडी और अन्य डिज़ाइन पैटर्न का उपयोग करता है। मान लेते हैं कि हम समाधान के एक नंबर के नीचे सूचीबद्ध है:

  • Solution.Model
  • Solution.Repository
  • Solution.Services
  • Solution.Presentation
  • Solution.UI.Web

उपयोगकर्ता अनुभव परत समाधान होगा .UI.Web और हम मान लेंगे कि यह एक एएसपी.NET वेबफॉर्म एप्लिकेशन होगा। आप क्लाइंट-साइड सत्यापन कैसे लागू करते हैं?

वहाँ रहे हैं चीजों के एक नंबर पर विचार किया जाएगा:

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

दूसरा, हम उपयोगकर्ता अनुभव परत पर सत्यापन नियमों को लागू नहीं करना चाहते हैं। ऐसा इसलिए है क्योंकि यदि आपका एप्लिकेशन एक वेब ऐप है और फिर आप WinApp क्लाइंट को भी बनाने का निर्णय लेते हैं, तो आपको फिर से सत्यापन नियमों को लागू करना होगा -> रखरखाव दुःस्वप्न।

एक सरल दृष्टिकोण आपके व्यूमोडल ऑब्जेक्ट्स (क्लाइंट को भेजे जाने वाले आपके डोमेन इकाइयों के फ़्लैट किए गए दृश्य) के साथ आपके सत्यापन तर्क को लागू करना होगा और फिर एप्लिकेशन/डेटाबेस सर्वर को मारने से पहले उन ऑब्जेक्ट को मान्य करना होगा।

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

अब एएसपी.नेट एमवीसी ढांचा जीवन को और अधिक आसान बनाता है। आप ईएफ + डाटा एन्नोटेशन का उपयोग कर सकते हैं, और एमवीसी मचान ढांचे के लिए आपके लिए अधिकतर काम कर सकते हैं। लेकिन यह मामला है यदि आप एक एमवीसी अनुप्रयोग बनाना चाहते हैं और jquery और जावा स्क्रिप्ट के साथ अपने सत्यापन तर्क को लागू करना चाहते हैं।

लेकिन अगर आपको एक सत्यापन फ्रेमवर्क को लागू करने के लिए एक और सामान्य दृष्टिकोण की आवश्यकता है जिसे विभिन्न अनुप्रयोगों में उपयोग और उपयोग किया जा सकता है, तो WinForms और WebForms कहें?

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

मैंने यहां कुछ और कार्यान्वयन और ढांचे को देखा है, और मैंने कुछ समय के लिए एएसपी.नेट एमवीसी क्लाइंट-साइड सत्यापन का उपयोग किया है। इसलिए मेरे उत्तर में एमवीसी या जावास्क्रिप्ट सत्यापन के साथ कुछ भी नहीं है।

पीएस। यदि आप संदर्भ लिंक, किताबें, लेख, नमूना परियोजनाओं और/या कोड स्निपेट्स का उल्लेख कर सकते हैं तो यह बहुत अच्छा होगा।

tnx, आर्मिन [:

उत्तर

2

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

हालांकि, एएसपी.नेट एमवीसी में सत्यापन मॉडल एक्स्टेंसिबल है और आप अतिरिक्त प्रमाणीकरण नियमों का समर्थन करने के लिए इसे विस्तारित कर सकते हैं या डेटा एनीोटेशन के अलावा एक सत्यापन ढांचे का आयोजन कर सकते हैं। Here एएसपी.नेट एमवीसी के साथ एंटरप्राइज़ लाइब्रेरी सत्यापन ब्लॉक को एकीकृत करने का एक उदाहरण है, हालांकि लेख के मुताबिक, क्लाइंट साइड सत्यापन लागू नहीं किया गया था। एक और दृष्टिकोण आपके डोमेन परत में DataAnnotations विशेषताओं का उपयोग करना होगा। डेटा एन्नोटेशन नेमस्पेस एएसपी.नेट एमवीसी से बंधे नहीं है।

हालांकि इन दृष्टिकोणों में चुनौती मॉडल वस्तुओं को देखने के लिए डोमेन ऑब्जेक्ट्स से सत्यापन नियमों का प्रचार करना है। सिद्धांत रूप में, आप AutoMapper का विस्तार कर सकते हैं जैसे मॉडल मॉडल देखने के लिए डोमेन मॉडल से सत्यापन नियमों को आगे बढ़ाया जाता है, हालांकि कार्यान्वयन और रखरखाव की लागत इस समाधान के लाभों से अधिक हो सकती है।

Fluent Validation फ्रेमवर्क को सभी समावेशी सत्यापन समाधान के लिए प्रारंभिक बिंदु के रूप में उपयोग किया जा सकता है। एएसपी.नेट एमवीसी के साथ इस ढांचे का उपयोग करने के कई examples हैं।

+0

अपने जवाब और लिंक के लिए धन्यवाद।आप सही हैं, मैं इस बारे में सोच रहा हूं और पिछले कुछ दिनों से कुछ नमूना अनुप्रयोगों पर काम कर रहा हूं और आज मुझे एहसास हुआ कि क्लाइंट-साइड सत्यापन को लागू करने की पूरी प्रक्रिया को स्वचालित करने की कोशिश करना थोड़ी अधिक होगी। अच्छी खबर यह है कि डेटा एनीमेशन नामस्थान का उपयोग डोमेन इकाइयों में सत्यापन तर्क को लागू करने या मॉडल ऑब्जेक्ट्स देखने के लिए किया जा सकता है। जो सत्यापन नियमों के केंद्रीकरण को हल करेगा। लेकिन अंततः हमें क्लाइंट पर वास्तविक सत्यापन लागू करना होगा, जो कि कोई बड़ी बात नहीं है। – Nexus

5

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

3

आपको अपने डोमेन ज्ञान का प्रतिनिधित्व करने वाले साधारण वर्गों में सत्यापन तर्क को समाहित करना चाहिए।

मैं इसके बारे में primitive obsession ब्लॉग पोस्ट में इसके बारे में लिखता हूं। यहाँ अपने ASP.NET MVC नियंत्रक यदि आप इस तरह कक्षाएं बनाने की तरह लग सकता है बताया गया है:

public class CustomerController : Controller 
{ 
    [HttpPost] 
    public ActionResult CreateCustomer(CustomerInfo customerInfo) 
    { 
     Result<Email> emailResult = Email.Create(customerInfo.Email); 
     Result<CustomerName> nameResult = CustomerName.Create(customerInfo.Name); 

     if (emailResult.Failure) 
      ModelState.AddModelError("Email", emailResult.Error); 
     if (nameResult.Failure) 
      ModelState.AddModelError("Name", nameResult.Error); 

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

     Customer customer = new Customer(nameResult.Value, emailResult.Value); 
     // Rest of the method 
    } 
} 

एनोटेशन उपयोग करने के लिए है क्योंकि वे अनिवार्य रूप से मान्यता तर्क नकल करने के लिए प्रोत्साहित करते आवश्यकता नहीं है।

इन कोड नमूने की तुलना करें: