दूसरे शब्दों में, आवश्यक फ़ील्ड, लंबाई सत्यापन, रेगेक्स इत्यादि जैसी कोई भी डेटा एनोटेशन आपके दृश्य मॉडल पर की जानी चाहिए, और त्रुटि होने पर मॉडल स्थिति में जोड़ा जाना चाहिए।
और आपके पास शायद व्यवसाय/डोमेन नियम होंगे जो कि केवल "फ़ॉर्म" से अधिक पर भरोसा करते हैं, इसलिए आपको डोमेन मॉडल में ऐसा करना चाहिए (सत्यापन के बाद सत्यापन को निष्पादित करें), या एक के साथ सेवा परत
हमारे सभी मॉडल में "मान्य" नामक एक विधि है, जिसे हम जारी रखने से पहले सेवाओं में कॉल करते हैं। वे कस्टम अपवाद फेंक देते हैं यदि वे व्यावसायिक सत्यापन विफल करते हैं, जो नियंत्रक द्वारा पकड़ा जाता है और मॉडल स्थिति में भी जोड़ा जाता है।
हर किसी के कप चाय नहीं हो सकता है, लेकिन यह लगातार है।व्यवसाय सत्यापन के
उदाहरण के लिए, के रूप में अनुरोध:
public abstract class Post
{
// .. fields, properties, domain logic, etc
public void Validate()
{
if (!this.GeospatialIdentity.IsValidForThisTypeOfPost())
throw new DomainException(this, BusinessException.PostNotValidForThisSpatial.);
}
}
: यहाँ (आदि सवाल, फोटो, वीडियो,) एक डोमेन मॉडल हमारे पास है, जो एक सामान्य "पोस्ट" का प्रतिनिधित्व करता है, इसका एक उदाहरण
आप वहां देखते हैं, मैं व्यवसाय नियमों के खिलाफ जांच कर रहा हूं, और कस्टम अपवाद फेंक रहा हूं। DomainException
हमारा आधार है, और हमारे पास कई व्युत्पन्न कार्यान्वयन हैं। हमारे पास BusinessException
नामक एक enum है, जिसमें हमारे सभी अपवादों के लिए मूल्य शामिल हैं। हम संसाधन-आधारित त्रुटि संदेश प्रदान करने के लिए enum पर एक्सटेंशन विधियों का उपयोग करते हैं।
यह मॉडल आईएम जांच पर बस एक क्षेत्र नहीं है, उदाहरण के लिए "सभी पदों में एक विषय होना चाहिए", क्योंकि यह डोमेन का हिस्सा है, हालांकि यह इनपुट सत्यापन पहले और सबसे महत्वपूर्ण है, और इस प्रकार डेटा एनोटेशन के माध्यम से संभाला जाता है दृश्य मॉडल पर।
अब, नियंत्रक:
[HttpPost]
public ActionResult Create(QuestionViewModel viewModel)
{
if (!ModelState.IsValid)
return View(viewModel);
try
{
// Map to ViewModel
var model = Mapper.Map<QuestionViewModel,Question>(viewModel);
// Save.
postService.Save(model); // generic Save method, constraint: "where TPost: Post, new()".
// Commit.
unitOfWork.Commit();
// P-R-G
return RedirectToAction("Index", new { id = model.PostId });
}
catch (Exception exc)
{
var typedExc = exc as DomainException;
if (typedExc != null)
{
// Internationalised, user-friendly domain exception, so we can show
ModelState.AddModelError("Error", typedExc.BusinessError.ToDescription());
}
else
{
// Could be anything, e.g database exception - so show generic msg.
ModelState.AddModelError("Error", "Sorry, an error occured saving the Post. Support has been notified. Please try again later.");
}
}
return View(viewModel);
}
तो, जब भी हम सेवा पर "सहेजें" विधि करने के लिए मिल द्वारा, मॉडल बीत चुका है इनपुट सत्यापन। फिर सहेजें विधि post.Validate()
पर कॉल करती है, व्यवसाय नियमों का आह्वान करती है।
यदि कोई अपवाद उठाया जाता है, तो नियंत्रक इसे पकड़ता है और संदेश प्रदर्शित करता है। यदि यह सेव विधि पास हो जाता है और दूसरी त्रुटि होती है (उदाहरण के लिए 90%, यह इकाई फ्रेमवर्क है), हम एक सामान्य त्रुटि संदेश दिखाते हैं।
जैसा कि मैंने कहा, सभी के लिए नहीं, लेकिन यह हमारी टीम के लिए अच्छा काम करता है। सफलता के बाद रीडायरेक्ट में हमारे पास प्रस्तुति और डोमेन सत्यापन का स्पष्ट पृथक्करण है, और कच्चे HTTP पोस्ट से नियंत्रण का लगातार प्रवाह होता है।
HTH
आपका "व्यावसायिक मॉडल" वास्तव में क्या है? –
व्यक्ति एक वर्ग है जिसे एंटीटीफ्रेमवर्क द्वारा ट्रैक किया जाता है। PersonViewModel स्पष्ट रूप से नहीं है .. मैंने जिस ब्लॉग पोस्ट से लिंक किया है उसे पढ़ें और आप उन अभ्यासों को समझेंगे जिन्हें मैं अनुवर्ती करने का प्रयास कर रहा हूं .. इसलिए सवाल यह है कि सत्यापन तर्क कहां जाना चाहिए। – ignaciofuentes
धन्यवाद - क्षमा करें, मैंने लेख स्कैन किया और इसके भीतर "व्यापार मॉडल" की खोज की लेकिन कोई हिट नहीं। –