2009-09-25 19 views
11

चलो कहते हैं कि मैं बहुत की तरह एक POCO करते हैं:क्या मुझे एक पीओसीओ में सत्यापन तर्क रखना चाहिए?

public class Name 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
} 

प्रथम नाम और अंतिम नाम रिक्त नहीं हो सकता है। मैं इस तरह एक विधि में जोड़ना चाहिए:

public List<Error> Validate() 
{ 
    var errors = new List<Error>(); 

    if (String.IsNullOrEmpty(FirstName)) 
     errors.Add(new Error("FirstName", "You must fill out first name.")); 
    if (String.IsNullOrEmpty(LastName)) 
     errors.Add(new Error("LastName", "You must fill out last name.")); 
} 

जहां Error एक struct है कि एक NameValueDictionary होता है। क्या यह चीजों को करने का एक अच्छा तरीका है? मैं संभावित रूप से भंडार के साथ एक समस्या देख सकता हूं जहां कोई व्यक्ति इस पीओसीओ को Validate() के माध्यम से इसे चलाने के बिना सहेजने का प्रयास करता है।

उत्तर

2

xVal जैसे पहलू-उन्मुख सत्यापन फ्रेमवर्क का उपयोग करने पर विचार करें।

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

public class Name 
{ 
    [Required] 
    public string FirstName { get; set; } 
    [Required] 
    public string LastName { get; set; } 
} 

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

+1

मैंने पहले xVal में देखा है लेकिन मुझे दस्तावेज़ीकरण और उदाहरणों की एक अलग कमी मिली है। शायद मैं इसे फिर से देख लूँगा कि मैं पीओसीओ का उपयोग कर रहा हूं। –

+0

अब जब मैं इसके बारे में सोचता हूं, तो आप उन मामलों को कैसे संभालेंगे जहां आपको अधिक उन्नत सत्यापन की आवश्यकता है, उदाहरण के लिए मान्य करें कि फ़ाइल पथ स्ट्रिंग हार्ड ड्राइव पर भौतिक फ़ाइल को इंगित करती है? –

+0

xVal आपको कस्टम सत्यापन विशेषताओं को बनाने देता है। यहां एक उदाहरण पृष्ठ दिया गया है: http://blog.codeville.net/2009/02/27/xval-08-beta-now-released/ – womp

3

मैं नहीं करूँगा। मेरे पीओसीओ के पास उनके संदर्भ के आधार पर अलग-अलग सत्यापन हैं। "मेरे व्यक्ति वस्तुओं को इस एप्लिकेशन में एक पता होना चाहिए, लेकिन उन्हें केवल इस अन्य एप्लिकेशन में एक फोन नंबर होना चाहिए" ... वह चीज है जिस पर आप नजर रखना चाहते हैं और इसके लिए लचीला होना चाहते हैं।

मैं एनीमिक डोमेन मॉडल का वकील हूं क्योंकि मैं आम तौर पर उसी डोमेन का पुन: उपयोग करता हूं, लेकिन संदर्भ के आधार पर अलग-अलग व्यवहार और सत्यापन निर्दिष्ट करता हूं (जो एक ही एप्लिकेशन के विभिन्न क्षेत्र भी हो सकता है)।

नई कार्यक्षमता को लागू करते समय, मैं आम तौर पर अपनी कक्षा को देखता हूं और खुद से यह प्रश्न पूछता हूं: क्या यह इस वर्ग की ज़िम्मेदारी की तरह प्रतीत होता है, या यह जिम्मेदारियों के एक अलग सेट के साथ कक्षा के लिए अधिक उपयुक्त होगा? हम इस सुविधा को "फ़ीचर ईर्ष्या" के लिए कहते हैं और यह प्रभावी ढंग से कक्षा को क्या करने के बारे में चिंतित करने में मदद करता है और इसके बारे में चिंतित नहीं है।

+0

अपने दूसरे अनुच्छेद के साथ सहमत हैं। यह सही कारण है कि नियम इंजन लोकप्रिय हो गए। – womp

+3

एनीमिक डोमेन मॉडल बेकार हैं। आप हर जगह एक ही व्यापार तर्क को रिकोड करना समाप्त कर देते हैं। मार्टिन फाउलर के मुताबिक यह वास्तव में एक एंटीपाटर है। और एनीमिक मॉडल डीटीओ से ज्यादा कुछ नहीं है। – Andy

+1

हालांकि टिप्पणियां पुरानी हैं, मैंने सोचा कि [एंडी रेफरिंग] के लिए एक लिंक जोड़ने में मददगार होगा (http://martinfowler.com/bliki/AnemicDomainModel.html)। – Derek

0

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

आपके नमूने में नियम सरल हैं, लेकिन आपको अक्सर अधिक जटिल नियम लिखने की आवश्यकता होगी। आपको शायद Csla.Net ढांचे की जांच करनी चाहिए।

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