2012-01-05 13 views
9

वेब आधारित mvc3 .net एप्लिकेशन के लिए उपयोग करने के लिए, आप किस सत्यापन फ्रेमवर्क की सिफारिश करेंगे? आवेदन डोमेन मॉडल पैटर्न और डोमेन मॉडल का पालन करता है पीओसीओ अलग वर्ग पुस्तकालय में हैं?आप .NET परियोजनाओं के लिए कौन सा सत्यापन ढांचा सुझाएंगे?

सत्यापन की तरह है कि हो जाएगा की आवश्यकता होगी ... अशक्त नहीं, नियमित अभिव्यक्ति आधारित आदि

+0

क्या आपको विभिन्न ढांचे के किसी भी फायदे/नुकसान की तुलना मिली है? –

उत्तर

18

मैं FluentValidation साथ जाना होगा, यह एक भयानक ओपन सोर्स प्रोजेक्ट

https://github.com/JeremySkinner/FluentValidation

यह है बुनियादी और अधिक जटिल मान्यताओं के लिए समान रूप से अच्छा

+0

spring.net के बारे में कैसे? – InfoLearner

+0

@nowledgeSeeker मुझे अनावश्यक रूप से जटिल लग रहा था .. लेकिन मैंने इस पर एक वैध राय देने के लिए एक असली परियोजना में उपयोग नहीं किया है। मैं बस इतना कह सकता हूं कि फ्लुएंट वैलिडेशन एमवीसी परियोजनाओं के लिए एक महान समाधान की तरह लगता है –

+0

क्या आपके पास एंटीलिब प्रमाणीकरण आवेदन ब्लॉक के साथ अनुभव है? यदि हां, तो आप FluentValidation क्यों पसंद करते हैं? –

3

यदि आपको विफलताओं की सूची की आवश्यकता है (और एक समय अपवाद में नहीं), तो मुझे एंटरप्राइज़ लाइब्रेरी सत्यापन ब्लॉक पसंद है।

पर PowerPoint प्रस्तुति देखें: http://msdn.microsoft.com/en-us/library/ff650484.aspx

आप अपने POCO वस्तुओं के खिलाफ सबसे बुनियादी सत्यापन ऊपर तार कर सकते हैं। और प्री-फैब नियमों में से एक को .config फ़ाइल में सेट किया जा सकता है।

और आप अपने नियम लिख सकते हैं।

मेरे नियम बहुत दानेदार हैं। वे एक समय में 1 सत्यापन करते हैं।

एक साधारण उदाहरण के रूप में: मेरे पास यह तय करने के लिए 2 अलग-अलग नियम होंगे कि कोई कर्मचारी किराया योग्य है (जन्मतिथि पर आधारित)। एक नियम यह सुनिश्चित करेगा कि कर्मचारी का जन्मदिन निर्दिष्ट किया गया हो।
एक दूसरा नियम यह सुनिश्चित करेगा कि जन्म तिथि वर्तमान तारीख से 18 वर्ष से अधिक हो। (या जो भी नियम था)।

(अब मान लें कि मेरे पास नियमों का एक समूह है)। तो प्रमाणीकरण दिनचर्या चलाने के बाद, मैं सूची में सभी (अमान्य) स्थितियों की एक सूची वापस प्राप्त करता हूं। उदाहरण के लिए, अगर मैं किसी कर्मचारी को मान्य कर रहा था, तो मुझे आक्रमण की एक सूची मिल जाएगी।

"अंतिम नाम प्रदान नहीं किया"

"FirstName नहीं प्रदान की थी"

"एसएसएन नहीं प्रदान की थी"

"एक समय में एक" के बजाय

। (इसे "एक समय में एक" करने से संभावित रूप से आपके चेक की वैधता को समझने के लिए कई पास होंगे)।

नीचे कुछ नमूना कोड है। मान लें कि किसी ने आईएसबीएन "एबीसी 123456" के साथ एक पुस्तक खरीदने की कोशिश की।

नीचे एक कस्टम नियम है जो यह देखने के लिए जांच करेगा कि वह पुस्तक मौजूद है (उदाहरण के लिए आपके उत्पाद डेटाबेस में)। मुझे लगता है कि आप साथ चल सकते हैं। यह बुक (.cs) पॉको ऑब्जेक्ट के खिलाफ वायर्ड किया जाएगा। ("वायर अप" में से कोई भी दिखाया नहीं गया है)। मैं बस आपको एक सरल उदाहरण देने का प्रयास कर रहा हूं कि एक साधारण नियम बनाने के लिए कितना कठिन (या कठिन नहीं) है।

जब कोई पुस्तक नहीं मिलती है (आईएसबीएन का उपयोग करके) .... तो आप सत्यापन को देखेंगे। AddResult विधि। इस तरह आप कई आक्रमण प्राप्त करते हैं। जब आप सत्यापन क्वेरी की जांच कर रहे हों तो आपको बाद में संग्रह तक पहुंच होगी।

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Text.RegularExpressions; 

using Microsoft.Practices.EnterpriseLibrary.Validation; 
using Microsoft.Practices.EnterpriseLibrary.Validation.Validators; 


namespace MyCompany.Applications.MyApplication.BusinessLogic.Validation.MyType1Validations 
{ 
    [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field)] 
    public class BookExistsValidatorAttribute : ValidatorAttribute 
    { 
     protected override Validator DoCreateValidator(Type targetType) 
     { 
      return new BookExistsValidator("BookExistsValidatorTag"); 
     } 
    } 

    public class BookExistsValidator : Validator<string> 
    { 

     public BookExistsValidator(string tag) : base("BookExistsValidatorMessageTemplate", tag) { } 

     protected override string DefaultMessageTemplate 
     { 
      get { throw new NotImplementedException(); } 
     } 

     protected override void DoValidate(string objectToValidate, object currentTarget, string key, ValidationResults validationResults) 
     { 

      bool bookExists = BookMatchExists(objectToValidate); 

      if (!bookExists) 
      { 
       string msg = string.Format("The Book does not exist. Your ISBN='{0}'", objectToValidate); 
       validationResults.AddResult(new ValidationResult(msg, currentTarget, key, 10001, this)); /* 10001 is just some number I made up */ 

      } 


     } 

     private bool BookMatchExists(string isbn) 
     { 
      bool returnValue = false; 

      IBookCollection coll = MyCompany.Applications.MyApplication.BusinessLogic.CachedControllers.BookController.FindAll(); /* Code not shown, but this would hit the db and return poco objects of books*/ 

      IBook foundBook = (from item in coll where item.ISBN.Equals(book, StringComparison.OrdinalIgnoreCase) select item).SingleOrDefault(); 

      if (null != foundBook) 
      { 
       returnValue = true; 
      } 
      return returnValue; 
     } 



    } 
} 
+0

क्या आपने spring.net सत्यापन फ्रेमवर्क का उपयोग किया है? – InfoLearner

+1

नहीं। मैंने नहीं किया है। मैंने एंटरप्राइज़ लाइब्रेरी के साथ शुरुआत की, और यह पता लगाया कि मुझे लगभग 2 दिनों में जो चाहिए वह मिल सकता है। देखें: http://stackoverflow.com/questions/3806447/spring-net-vs-enterprise-library और http://stackoverflow.com/questions/751700/which- validation-framework-to-choose-spring- वैधता- या दोनों के बारे में अधिक टिप्पणियों के लिए प्रमाणीकरण-आवेदन। एंटरप्राइज़ लाइब्रेरी में हमेशा अच्छा समर्थन और दस्तावेज़ीकरण होता है, इसलिए मैं वर्षों से इसके साथ अटक गया हूं। मैं पहले ही ई.एल.डेटा का उपयोग कर रहा था, इसलिए सत्यापन कोड का उपयोग करना मेरे लिए एक आसान संक्रमण था। – granadaCoder

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