asp.net-mvc-3 - क्यों दो वर्ग, मॉडल और डोमेन मॉडल देखें?




model viewmodel modelbinders (5)

मुझे पता है कि मॉडल मॉडल के रूप में डोमेन मॉडल का उपयोग करना बुरा हो सकता है। यदि मेरे डोमेन मॉडल में IsAdmin नाम की एक संपत्ति है और मेरे पास उपयोगकर्ताओं को बनाने के लिए एक नियंत्रक क्रिया बनाएं, तो कोई मेरा फॉर्म बदल सकता है और इसे एक ISAdmin = true फॉर्म मान पोस्ट करने के लिए प्राप्त कर सकता है, भले ही मैंने अपने दृश्य में ऐसे टेक्स्ट फ़ील्ड का पर्दाफाश न किया हो । अगर मैं मॉडल बाध्यकारी का उपयोग कर रहा हूं तो जब मैंने अपना डोमेन मॉडल किया, तो वह व्यक्ति अब एक व्यवस्थापक होगा। इसलिए समाधान केवल दृश्य मॉडल में आवश्यक गुणों को उजागर कर रहा है और मेरे डोमेन मॉडल ऑब्जेक्ट के लिए मेरे लौटने वाले दृश्य मॉडल ऑब्जेक्ट के प्रॉपर्टी वैल्यू को मैप करने के लिए ऑटोमैपर जैसे टूल का उपयोग कर रहा है। लेकिन मैंने पढ़ा कि क्लास पर बाइंड विशेषता का उपयोग मॉडल बाइंडर को निर्देश देने के लिए किया जा सकता है, जो गुणों को बांधना चाहिए और बांधना नहीं चाहिए। तो दो अलग-अलग वर्ग (डोमेन मॉडल और दृश्य मॉडल) बनाने का वास्तव में क्या कारण है जो आवश्यक रूप से एक ही चीज़ का प्रतिनिधित्व करते हैं और फिर उन्हें मानचित्रण में ओवरहेड लगाते हैं? क्या यह एक कोड संगठन मुद्दा है और यदि हां, तो मुझे कैसे फायदा हो रहा है?

संपादित करें

जटिल मॉडल के प्रबंधन के लिए एमवीवीएम पैटर्न (मार्टिन फाउलर के पीएम पैटर्न के आधार पर) को लागू करने के लिए डोमेन मॉडल से अलग एक दृश्य मॉडल के लिए आने वाले सबसे महत्वपूर्ण कारणों में से एक है।


Answers

आपको याद रखना होगा कि आपके domain model classes केवल internally उपयोग की domain model classes हैं; यानी, वे कभी ग्राहक को नहीं भेजे जाते हैं। यही है कि आपके सेवा मॉडल प्रकार (मॉडल प्रकार देखें) का उपयोग किया जाता है-वे उस डेटा का प्रतिनिधित्व करते हैं जो ग्राहक और आपकी सेवा के बीच आगे और आगे जा रहा है।


एक व्यू मॉडेल केवल उन सदस्यों को रखता है जिन्हें दृश्य द्वारा आवश्यक है। उन्हें आमतौर पर अंतर्निहित डोमेन मॉडल के सरलीकरण या "फ़्लैटनिंग" के रूप में माना जा सकता है।

उनके बारे में सोचें:

  • ViewModel : यह वह डेटा है जो इस दृश्य को प्रस्तुत करने के लिए उपयुक्त है
  • डोमेन मॉडल : यह सभी जानकारी है कि इस एप्लिकेशन के बारे में मेरी सभी कार्यक्षमताओं को करने के लिए इस एप्लिकेशन के बारे में आवश्यकता है

उदाहरण के लिए, मेरे ऑर्डर क्लास में ग्राहक नामक एक सदस्य होता है जो एक composition संगठन है, यानी, मेरे ऑर्डर में ग्राहक है। इस ग्राहक ऑब्जेक्ट में फर्स्टनाम, लास्टनाम इत्यादि जैसे सदस्य हैं ... लेकिन मैं आदेश के "विवरण" दृश्य या ऑर्डर की सूची और उन ग्राहकों को कैसे रखूंगा जो उन्हें रखे?

खैर, व्यूमोडेल का उपयोग करके मेरे पास ऑर्डरलिस्ट इटिम व्यूमोडेल हो सकता है जिसमें ग्राहक नाम सदस्य हो और मैं ग्राहक ऑब्जेक्ट से फर्स्टनाम और अंतिम नाम के संयोजन को मैप कर सकता हूं। यह मैन्युअल रूप से किया जा सकता है, या अधिकतर Automapper या इसी तरह का Automapper कर सकते हैं।

इस दृष्टिकोण का उपयोग करके, आपके पास एकाधिक ऑर्डर व्यूमोडल्स हो सकते हैं जो अलग-अलग विचारों के लिए विशिष्ट हैं, उदाहरण के लिए ऑर्डर सूची दृश्य ऑर्डर विवरण दृश्य के लिए अलग-अलग तरीके से ग्राहक नाम प्रस्तुत कर सकता है।

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


व्यूमोडेल रखने का एक और अच्छा कारण डेटा के बड़े सेट पेजिंग कर रहा है। आप व्यक्ति ( Person[] ) की एक सरणी देख सकते हैं, लेकिन मेटाडेटा जैसे पृष्ठों की संख्या, वर्तमान पृष्ठ की संख्या, पृष्ठ का आकार Person वर्ग पर नहीं होगा।

इसलिए एक PersonListViewModel इस मुद्दे को हल करेगा।


मैंने पाया है कि मेरे डोमेन मॉडल में मुझे खेतों के 85% तरीके मिलते हैं, लेकिन मैंने कभी भी मेरे विचारों पर 100% मूल्यों को शामिल नहीं किया है। खासकर जब अनुमतियों की बात आती है और क्या उपयोगकर्ता को दृश्य के कुछ हिस्सों तक पहुंच प्राप्त होनी चाहिए या नहीं।

जिस डिजाइन अवधारणा का मैं पालन करने का प्रयास करता हूं वह मेरे विचारों में जितना संभव हो उतना छोटा तर्क है। इसका मतलब है कि मेरे पास मेरे दृश्य मॉडल में फ़ील्ड हैं जैसे "CanViewThisField" या "CanEditThisField।" जब मैंने पहली बार एमवीसी के साथ शुरुआत की, तो मेरा डोमेन मॉडल मेरा दृश्य मॉडल होगा और मैं हमेशा परिदृश्य में दौड़ रहा था जहां मुझे अपने दृश्य को कम अव्यवस्थित बनाने के लिए केवल एक या दो फ़ील्ड की आवश्यकता थी। मैं बाद में व्यू मॉडल / मॉडल बिल्डर मार्ग चला गया हूं और यह मेरे लिए अद्भुत काम करता है। मैं अब अपने कोड से लड़ता नहीं हूं लेकिन मेरे मॉडल मॉडल को बढ़ाने में सक्षम हूं क्योंकि मुझे डोमेन मॉडल को प्रभावित किए बिना आवश्यकता है।


मैं पैकेज स्थापित करने के लिए पैकेज प्रबंधक कंसोल का उपयोग कर रहा था और यह त्रुटि प्राप्त कर रहा था। Nuget पैकेज प्रबंधक UI का उपयोग करके आश्चर्यजनक रूप से इस त्रुटि उत्पन्न नहीं हुई और समस्या हल हो गई।





asp.net-mvc-3 model viewmodel modelbinders