एएसपी.नेट एमवीसी प्रोजेक्ट में हम संपादन मॉडल/पोस्टमोडेल को कैसे परिवर्तित करें हम डोमेन मॉडल से देखने के लिए ऑटोमैपर का उपयोग कर रहे हैं - और कभी-कभी ऐसा करने के दौरान पदानुक्रम को भी फ़्लैट करना। यह एक आकर्षण की तरह काम करता है और हमारे विचारों के प्रतिपादन तर्क को बहुत दुबला और सरल बनाता है।डोमेन मॉडल
भ्रम शुरू होता है जब हम डोमेन मॉडल के लिए viewmodel (या postmodel या editmodel) से अन्य रास्ते जाने के लिए, खासकर जब अद्यतन करने वस्तुओं चाहते हैं। हम स्वचालित नहीं कर सकते का उपयोग/दो तरह मानचित्रण है क्योंकि:
- हम चपटा पदानुक्रम
- डोमेन मॉडल पर सभी गुण unflat को परिवर्तनशील होना चाहिए था होता/सार्वजनिक setters
- परिवर्तन दृश्य से आने से हमेशा डोमेन पर वापस मैप किए जाने वाले फ्लैट गुण नहीं होते हैं, लेकिन कभी-कभी "
ChangeManagerForEmployee()
" या इसी प्रकार की विधियों को कॉल करने की आवश्यकता होती है।
यह भी जिमी Bogards लेख में वर्णित है: The case for two-way mapping in AutoMapper, लेकिन इस का हल विस्तार से वर्णन किया नहीं है, केवल कि वे जाना:
EditModel से CommandMessages के लिए - loosely- से जा रहा संपादित मॉड्यूल दृढ़ता से टाइप किए गए संदेशों को तोड़ने के लिए टाइप किया गया। एक एकल संपादन मॉडल आधा दर्जन संदेश उत्पन्न कर सकता है।
एक समान SO question में Mark Seeman द्वारा एक जवाब है, जहां वह उल्लेख है कि वहाँ
हम सार मानचित्रकारों और सेवाओं का उपयोग एक डोमेन वस्तु
लेकिन विवरण के लिए एक PostModel मैप करने के लिए - वैचारिक और तकनीकी कार्यान्वयन - छोड़ दिया गया है।
हमारे विचार अभी के लिए है:
- प्राप्त नियंत्रक की कार्रवाई विधि में एक FormCollection
- मूल डोमेन मॉडल प्राप्त करें और viewModelOriginal और viewModelUpdated
- viewModelUpdated
UpdateModel()
का उपयोग करते हुए FormCollection विलय करने के लिए इसे समतल - viewModelOriginal की तुलना करने के लिए कुछ सामान्य सहायक विधि का उपयोग करें ViewModelUpdated
- या तो ए) उत्पन्न करें CommandMessages एक ला जिमी Bogard या बी) गुण और विधियों (शायद सीधे AutoMapper के माध्यम से) 1-1 गुण मानचित्रण के माध्यम से डोमेन मॉडल में सीधे मतभेद Mutate
कोई कैसे वे के माध्यम से FormCollection से आते हैं के कुछ उदाहरण प्रदान कर सकते हैं डोमेन मॉडल में editmodel/postmodel? "कमांड मैसेज" या "अमूर्त मैपर और सेवाएं"?(- मुझे लगता है कि इस अवधारणा को आप अनदेखा कर रहे थे हो सकता है कमान क्वेरी जिम्मेदारी पृथक्करण), संभवतः भी घटना सोर्सिंग के साथ
[HttpPost]
public ActionResult Update(UpdateProductViewModel viewModel)
{
// fetch the domain model that we want to update
Product product = repository.Get(viewModel.Id);
// Use AutoMapper to update only the properties of this domain model
// that are also part of the view model and leave the other properties unchanged
AutoMapper.Map<UpdateProductViewModel, Product>(viewModel, product);
// Pass the domain model with updated properties to the DAL
repository.Update(product);
return RedirectToAction("Success");
}
यदि मैं कर सकता तो मैं यह प्रश्न एक हजार अपवॉट्स दूंगा। मैं इस के ठोस जवाब के लिए अंतहीन खोज कर रहा हूं। – devuxer
अंत में आप किस प्रक्रिया के साथ गए थे? –
हाय टॉम। हमने एक मिश्रण और मिलान समाधान का उपयोग करके समाप्त किया, जहां हम 1. डीएएल/डीबी से डोम ऑब्जेक्ट पुनर्प्राप्त करते हैं, 2. डोम ऑब्जेक्ट को व्यूमोडेल पर फ़्लैट करें, 3. ViewModel पर फॉर्मकॉल के साथ TryUpdateModel का उपयोग करें, 4।सरल गुणों पर फ़्लैटेड व्यूमोडेल से डोम (पदानुक्रम) तक रिवर्स मैपिंग करने के लिए ऑटोमैपर का उपयोग करें और 5. व्यूमोडेल से डोम विधियों (डोम ऑब्जेक्ट और/या डोम सर्विस) से गैर-तुच्छ गुणों को मैप करने के लिए सेवा का उपयोग करें। उम्मीद है कि यह मदद करता है - मुझे यकीन नहीं है कि कौन सा जवाब सही के रूप में चिह्नित करने के लिए है, क्योंकि यह एक से अधिक का मिश्रण है ...? –