2013-06-09 3 views
7

के खिलाफ जांच करने के लिए प्रमाणकों के प्रयोग से। प्रत्येक चीज पूरी तरह से काम करती है और यह मेरे आईओसी (स्ट्रक्चर मैप) से जुड़ा हुआ है।FluentValidation, प्रमाणकों के जीवन चक्र और मैं अपने <strong>MVC4</strong> परियोजना में <strong>FluentValidation</strong> उपयोग कर रहा हूँ Db

  1. मैं अपने प्रमाणकों की जीवन चक्र का प्रबंधन कैसे करना चाहिए:

    मैं 2 प्रश्न हैं? क्या उन्हें सिंगलटन बनाना ठीक है? या इससे कोई फर्क नहीं पड़ता है और मैं मेरी आवश्यकताओं के अनुसार जीवन चक्र का प्रबंधन कर सकता हूं? यहाँ सबसे अच्छा अभ्यास क्या है?

  2. FluentValidation बहुत अच्छा है। मैं इसे के लिए सरल सत्यापन (जैसे: संपत्ति खाली नहीं है, आदि) का उपयोग कर रहा हूं। मैं कुछ Db सत्यापन कर इसे प्रयोग के बारे में सोच रहा हूँ: मैं अपने भंडार इसे करने के लिएStructureMap का उपयोग कर गुजरती हैं और Db के खिलाफ मूल्यों की जाँच कर सकते हैं (जैसे संपत्ति के मूल्य अद्वितीय है।)। क्या यह एक अच्छा विचार है? या क्या मुझे इस तर्क को मेरे सेवा परत में लागू करना चाहिए और मेरे IValidator में नहीं?

यदि आपने इसे समान परिदृश्यों में उपयोग किया है, तो आपका अनुभव क्या था?

उत्तर

5

मैंने वर्षों से FluentValidation का उपयोग किया है और आपके प्रश्न पूछे और समझ लिया है।

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

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

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

इस के साथ पागल जाओ, यह FluentValidation की एक बड़ी फायदा है, बस सुनिश्चित निर्भरता समय और संसाधनों के संबंध में महंगा नहीं है।

+0

धन्यवाद @ खालिद। मैं पूर्णतः सन्तुष्ट हुँ। आपकी प्रतिक्रिया के लिए –

2

प्रमाणीकरण आश्चर्यजनक रूप से एक जटिल है और आमतौर पर आपके आवेदन के लिए आर्किटेक्चर पर निर्भर करता है, लेकिन यहां मेरे विचार हैं।

  1. सत्यापनकर्ताओं को आपकी आवश्यकताओं के अनुसार प्रबंधित किया जाना चाहिए। मैं आम तौर पर कारखानों या ऑब्जेक्ट बिल्डरों जैसे आधारभूत संरचना चिंताओं की सेवा करने के लिए स्थैतिक वर्ग के उदाहरण छोड़ दूंगा।

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

उम्मीद है कि इससे मदद मिलती है।

+0

धन्यवाद बहुत @ केन। बहुत उपयोगी। :) –

4

मैं सिर्फ अपने आप को इस में देख कर दिया है एकता और MVC 4.

का उपयोग कर क्या मैंने देखा है कि अगर आप उन्हें क्षणिक वस्तुओं के रूप में रहते हैं। FluentValidation मान्य होने वाली प्रत्येक संपत्ति के लिए एक नई सत्यापन वस्तु तैयार करेगा। तो कुछ कैशिंग की आवश्यकता है।

मेरे कैशिंग के लिए मैंने सत्यापनकर्ता के प्रति अनुरोध कैशिंग को देखा है। यह अच्छी तरह से काम करता है क्योंकि सभी निर्भर घटक प्रति अनुरोध हैं। (प्रति अनुरोध एक कस्टम कोड है जो HttpContext.Current.Items संग्रह पर एक HTTP मॉड्यूल के साथ संग्रह करता है जो अनुरोध के अंत में बाल कंटेनर को नष्ट/डिस्प्ले करता है)

प्रति अनुरोध और सिंगलटन इंस्टेंट्स के बीच चयन करने के लिए वैधकर्ता का यह पता चलता है कि इसका उपयोग कैसे किया जाता है और इसकी किस तरह की निर्भरताएं हैं और आईओसी कॉन्टिनर की क्षमताओं।

एकता के साथ आप एक सिंगलटन सत्यापनकर्ता बना सकते हैं और एक फ़ंक्शन यानी Func serviceFunc का उपयोग करके सेवा फैक्ट्री इंजेक्ट कर सकते हैं।

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

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

मैंने अभी सेवा का उपयोग करने के लिए अपना कोड अपडेट किया है और आज इसका परीक्षण करेंगे। मेरा मानना ​​है कि यह आपके अनुप्रयोगों के लिए सही समाधान खोजने के लिए एक त्रुटि का परीक्षण करेगा। बजाय एकता कंटेनर का उपयोग कर (वेब ​​पर सबसे उदाहरण करते हैं), मैं इस पर IDependencyResolver इंजेक्शन लगाने कर रहा हूँ और मेरे सत्यापनकर्ता वस्तुओं को हल करने का उपयोग कर -

नीचे validtion कारखाने मैं उपयोग कर रहा हूँ है।

public class ValidatorFactory : IValidatorFactory 
{ 
    private readonly IDependencyResolver _dependencyResolver; 

    // taken from the attribute Validation factory 
    public ValidatorFactory(IDependencyResolver dependencyResolver) 
    { 
     _dependencyResolver = dependencyResolver; 
    } 

    /// <summary> 
    /// Gets a validator for the appropriate type. 
    /// 
    /// </summary> 
    public IValidator<T> GetValidator<T>() 
    { 
     return (IValidator<T>)this.GetValidator(typeof(T)); 
    } 

    /// <summary> 
    /// Gets a validator for the appropriate type. 
    /// 
    /// </summary> 
    public virtual IValidator GetValidator(Type type) 
    { 
     if (type == (Type)null) 
      return (IValidator)null; 
     var validatorAttribute = (ValidatorAttribute)Attribute.GetCustomAttribute((MemberInfo)type, typeof(ValidatorAttribute)); 
     if (validatorAttribute == null || validatorAttribute.ValidatorType == (Type) null) 
     { 
      return (IValidator) null; 
     } 
     else 
     { 
      return _dependencyResolver.GetService(validatorAttribute.ValidatorType) as IValidator; 
     } 
    } 
} 
+0

धन्यवाद एडिस –

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

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