IValiditableObject बनाम एकल जिम्मेदारी


12

मुझे एमवीसी की एक्स्टेंसिबिलिटी बिंदु पसंद है, जो आइडियल आईडबलटेबल ऑबजेक्ट को लागू करने और कस्टम सत्यापन जोड़ने की अनुमति देता है।

मैं अपने नियंत्रकों को दुबला रखने की कोशिश करता हूं, इस कोड के पास केवल सत्यापन तर्क है:

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

उदाहरण के लिए एक लॉगिन दृश्य मॉडल IValidatableObject को लागू करता है, निर्माता इंजेक्शन के माध्यम से ILoginValidator ऑब्जेक्ट प्राप्त करता है:

public interface ILoginValidator
{
    bool UserExists(string email);
    bool IsLoginValid(string userName, string password);
}

ऐसा लगता है कि निनजे, दृश्य मॉडल में उदाहरणों को इंजेक्ट करना वास्तव में एक सामान्य अभ्यास नहीं है, यहां तक ​​कि एक विरोधी पैटर्न भी हो सकता है?

क्या यह एक अच्छा तरीका है? क्या कोई बेहतर है?


यदि आप एक अलग ऑब्जेक्ट में सत्यापन चाहते हैं, तो FluentValidation का प्रयास करें। देखें fluentvalidation.codeplex.com/wikipage?title=mvc
rmac

+1 एक अलग विचारक वर्ग को इंजेक्ट करने का महान विचार, जो मेरी समस्या को हल करता है जहाँ मुझे सत्यापन के लिए डेटाबेस की जानकारी प्राप्त करनी है!
मैग्नेटिक

जवाबों:


7

निजी तौर पर, मुझे आपका डिज़ाइन साफ ​​लगता है।

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


4

सत्यापन के लिए एक समर्पित वस्तु होने की गारंटी देता है कि आप वास्तव में SRP का सम्मान करते हैं - जो कि पहले से ही मामला था क्योंकि यह अपने डेटा को मान्य करने के लिए एक दृश्य मॉडल की एक विशिष्ट जिम्मेदारी है।

उदाहरणों में उदाहरणों को इंजेक्ट करने के लिए, मैं उसके साथ कुछ भी गलत नहीं देख सकता। वस्तुतः कोई सीमा नहीं है कि किस चीज को इंजेक्ट किया जा सकता है।


3

ILoginValidator को अपने VM कंस्ट्रक्टर में इंजेक्ट करने के बजाय आप अपने Validator को प्राप्त करने के लिए ValidationContext (जो कि IValidatableObject.Validate () का arg है) का उपयोग कर सकते हैं।

public IEnumerable<ValidationResult> Validate(ValidationContext vc)
{

var loginValidator = (ILoginValidator)vc.GetService(typeof(ILoginValidator));
return loginValidator.Validate();

}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.