2012-08-04 7 views
5

मैं विभिन्न परियोजनाओं पर इसका इस्तेमाल करने के लिए एक मान्यता घटक लिखने के लिए जा रहा हूँ। मैं Enterprise लाइब्रेरी VAB, Fluent, CuttingEdge.Conditions की तरह मान्यता चौखटे और इतने सारे दूसरों से किसी के साथ वास्तव में परिचित नहीं हूँ, लेकिन मैं उन सभी के साथ काम करने के लिए देखने के लिए जो मेरा उद्देश्य के लिए बेहतर है समय नहीं है।WCF और WebService विधि पैरामीटर मान्य की सबसे अच्छा तरीका महत्व देता

पहले, मैं EmailValidator, StringLengthValidator, MyCustomValidator जैसे कुछ प्रमाणकों और इतने पर करना चाहते हैं, कि मैं उन्हें इस्तेमाल कर सकते हैं जब भी मैं में हैं:

मैं इस घटक मेरे लिए 2 अलग कार्यक्षमताओं प्रदान करना चाहते हैं कोड, नीचे की तरह:

public class EmailValidator : RegexValidator // or StringValidator or whatever! 
{ 
    public EmailValidator() : base("emailRegexHere") 
    { 
    } 
public bool override DoValidate(string value) 
    { 
     return base.DoValidate(value); 
    } 
} 
... 

public void MyMethod(string email) 
{ 
    EmailValidator validator = new EmailValidator(); 
    if(!validator.Validate(email)) 
     throw new NotValidatedException("email is invalid."); 
    ... 
} 

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

इसके अलावा माइक्रोसॉफ्ट आईपीएएमटरेटर इंस्पेक्टर को Perform Input Validation in WCF पर पेश करता है जो 2 विधियों BeforCall और AfterCall प्रदान करता है, लेकिन मुझे लगता है कि यह केवल डब्ल्यूसीएफ के लिए काम करता है।

लपेट के लिए, मैं इस तरह मेरी WCF या WebService में मान्यकरण करना होगा:

[System.Web.Script.Services.ScriptService] 
public class MyServiceClass : System.Web.Services.WebService 
{ 
    [Aspects.Validate] 
    [WebMethod(EnableSession = true)] 
    public string SubmitComment([Validation.Required]string content,[Validation.Guid] string userId,[Validation.Required] [Validation.Name]string name, [Validation.Email]string email, string ipAddress) 
    { 
     ... 
    } 
} 

नोट: यह सिर्फ व्यवहार है कि मैं जरूरत है प्रदर्शित करने के लिए एक नमूना कोड है, किसी भी अन्य सुझाव है अच्छी तरह से सराहना की। यह भी एक अच्छा विचार है कि प्रमाणीकरण। * एनोटेशन को एक टिप्पणी में बदला जा सकता है जैसे वैलीडेटपेरम (टाइपफॉफ़ (ईमेलवैलिएटर))?

अग्रिम

उत्तर

3

हाँ धन्यवाद, मैं सिर्फ इस बात के लिए PostSharp पर विचार करेंगे। एक OnMethodBoundaryAspect या MethodInterceptionAspect जो विधि के पैरामीटर की जांच करता है (गुणों के लिए जो वैध हैं) और तर्क (वे मान जिन्हें आप मान्य करना चाहते हैं) की जांच करता है।

इससे पहले कि आप OnMethodBoundaryAspect का उपयोग किया है के बाद से, MethodExecutionArgs के लिए दस्तावेज़ पर एक नज़र डालें। आप args.Method के साथ विधि जानकारी प्राप्त कर सकते हैं (MethodBase लौटाता है, जो सिस्टम में है। रिफ्लेक्शन)। उस पर GetParameters() पर कॉल करें, जो ParameterInfo की एक सरणी देता है। प्रत्येक ParameterInfo ऑब्जेक्ट पर, आप Attributes संपत्ति के साथ विशेषताओं के बारे में जानकारी प्राप्त कर सकते हैं।

एक बार जब आप विशेषताओं पता है, तुम तो जो सत्यापन तरीकों का उपयोग करने के लिए पता है (या यदि आप अपने स्वयं के गुण बना रहे हैं, सत्यापन विधि उन खुद को कक्षाओं विशेषता में हो सकता है)। फिर आपको तर्कों के मान प्राप्त करने के लिए args.Arguments का उपयोग करने की आवश्यकता है।

वास्तविक कोड नहीं है यही कारण है कि:

यहाँ कुछ (छद्म) कोड है अपने आप को बाहर काम करने के विवरण आप होगा।

मैं खुद को विशेषताओं में सत्यापन कोड डाल, क्योंकि आप अतिरिक्त सत्यापन प्रकार जोड़ने के लिए पहलू बदलने की जरूरत नहीं होगी का विचार पसंद।

+1

यह वही है जो मुझे दिमाग में था, और मैंने लगभग कोडिंग समाप्त कर दी। मै मैट वेबर द्वारा यह [पोस्ट] (http://badecho.com/2011/11/validating-method-parameters-with-postsharp) पाया जो सहायक था (पहला भाग)। गुणों में सत्यापन कोड डालने के बारे में, मैंने एक इंटरफ़ेस विधि 'GetValidator' जोड़ा, इसलिए प्रत्येक विशेषता इसके उपयुक्त सत्यापनकर्ता को लौटाती है। मुझे जिस समस्या का सामना करना पड़ रहा है वह सामान्य रिक्तियों जैसे 'रेंज वैलिडेटेटर' के लिए है, क्योंकि सी # जेनेरिक विशेषताओं का समर्थन नहीं करता है, इसलिए मुझे प्रत्येक प्रकार के int, double, datetime जैसे कन्स्ट्रक्टर अधिभार लिखना है ... – Ashkan

+1

वैसे धन्यवाद! आपके जवाब ने मुझे इस दृष्टिकोण के बारे में बेहतर महसूस किया। इसके अलावा मैं अपने सत्यापनकर्ता FluentValidation के साथ लिख रहा हूं। मुझे लगता है कि यह बहुत अच्छा है। – Ashkan

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