2009-12-21 20 views
31

व्यूमोडेल एक ऐसा शब्द है जिसका उपयोग एमवीवीएम (मॉडल-व्यू-व्यू मॉडेल) और एएसपी.नेट एमवीसी के लिए अनुशंसित कार्यान्वयन दोनों में किया जाता है। "व्यूमोडेल" का शोध भ्रमित हो सकता है क्योंकि प्रत्येक पैटर्न एक ही शब्द का उपयोग करता है।एमवीवीएम व्यूमोडेल बनाम एमवीसी व्यूमोडेल

एमवीसी व्यू मॉडेल और एमवीवीएम व्यूमोडेल के बीच मुख्य अंतर क्या हैं? उदाहरण के लिए, मेरा मानना ​​है कि नियंत्रक की कमी के कारण एमवीवीएम व्यू मॉडेल अधिक समृद्ध है। क्या ये सच है?

उत्तर

42

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

एमवीसी में, व्यूमोडेल एक दृश्य के लिए आवश्यक सभी जानकारी प्रदान करता है। इसमें शामिल डेटा मॉडल में परिभाषित डेटा का उपयोग करके बनाया गया है। व्यू ViewModel पढ़ता है और आउटपुट प्रस्तुत करता है। व्यू से इनपुट नियंत्रक को पास किया जाता है, जो मॉडल में हेरफेर करता है, उचित व्यू मॉडेल बनाता है, और इसे प्रतिपादन के लिए दृश्य में पास करता है।

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

+0

अभ्यास में; एएसपी.नेट एमवीसी में व्यूमोडेल दृश्य में 'मैजिक स्ट्रिंग्स' की अनुमति नहीं देता है; और प्रदर्शित करने के लिए दृढ़ता से टाइप मॉडल प्रदान करता है (इंटेलिजेंस शामिल है, और वह जैज़)। अन्यथा, उत्कृष्ट जवाब। –

+0

अच्छा जवाब। @ जॉर्ज: आप अभी भी एमवीसी में मैजिक स्ट्रिंग्स का उपयोग कर सकते हैं ... यह एमवीसी की चिंता नहीं है ... यह इस अभ्यास को रोकने के लिए कुछ भी नहीं करता है। –

8

इसके बाद से मैं खेला यूआई डिजाइन पैटर्न बिंगो .. लेकिन मुझे इस पर एक चाकू ले जाने के लिए एक समय हो गया है ..

MVVM सिर्फ कुछ है कि एमएस के साथ आ गया है ... आप प्राप्त करने के लिए है क्योंकि यह मदद करता है डब्ल्यूपीएफ का सबसे अधिक। आप दृश्य के राज्य और व्यवहार को एक वर्ग (एक प्रेजेंटेशन मॉडल) में जोड़ते हैं जो आसानी से टेस्ट करने योग्य है + फिर आप किसी भी दृश्य में डेटा प्राप्त करने के लिए डेटा-बाइंडिंग का उपयोग करते हैं।

यह link में एमवीवीएम के विकास का एक संक्षिप्त विवरण है। इसे फाउलर की "GUI Architectures" श्रृंखला के साथ संयोजित करें, और आपको अपने रास्ते पर होना चाहिए।

अद्यतन: पता नहीं था कि MVC-VM नामक कुछ था। जाहिर है एएसपी.नेट एमवीसी भीड़ का एक दिमाग। एमवीवीएम के समान दिखता है और लगता है (एएसपी.नेट एमवीसी के लिए ट्यून किए गए को छोड़कर); केवल अंतर यह है कि यह एक प्रतिबंध लगाता है कि वीएम और व्यू के बीच 1: 1 मैपिंग है। मैंने अनुमान लगाया होगा 1: एन, लेकिन बाकी सब कुछ मेल खाता है।

3

मुझे पता है कि यह एक (रास्ता) पुराना सवाल है, लेकिन मुझे इसे एमवीसी के संदर्भ में "मॉडल देखें" का उपयोग करने का एक उदाहरण के रूप में इंगित किया गया है। मैं तर्क देता हूं कि यह गलत है और उन लोगों द्वारा भ्रम पैदा कर सकता है जो या तो/या दोनों पैटर्न के लिए नए हैं। जो भी यह कर रहा है - stahp। यहां क्यों है (और यह एक चौराहे के रास्ते में मूल प्रश्न का भी उत्तर है)।

यह होने पर एक उदाहरण this question में देखा जा सकता है। उपयोगकर्ता एक व्यू मॉडल का उपयोग करने की कोशिश कर रहा है जो एक एएसपी.नेट एमवीसी अनुप्रयोग में बदल दिया गया है, इस प्रकार एक वास्तुशिल्प असफल और दिल की धड़कन में डेस्कटॉप और स्टेटलेस वेब एप्लिकेशन डिज़ाइन को एकसाथ मैश कर रहा है।

इसे सरलता से रखने के लिए, एमवीसी पैटर्न में कोई "मॉडल देखें" नहीं है। है, हालांकि, एक कार्यात्मक समतुल्य है, और यह नियंत्रक है।बस, भागों और उनके purpouses के बारे में स्पष्ट होना

MVVM (डेस्कटॉप अनुप्रयोग):

  • मॉडल - दृढ़ता से टाइप किया उद्देश्य यह है कि देखें और देखें मॉडल
  • बीच भेजा जाता है डेटा रखता है देखें - यूआई उपयोगकर्ता द्वारा और जिसके माध्यम से उपयोगकर्ता प्रणाली
  • देखें मॉडल साथ सूचना का आदान देखी - उपयोगकर्ता क्रियाओं (जैसे, ICommand के माध्यम से), उन्हें प्रदर्शन करती है, अद्यतन Appl व्याख्या ication राज्य

MVC (वेब ​​अनुप्रयोगों):

  • मॉडल - दृढ़ता से टाइप किया * उद्देश्य यह है कि डेटा को होल्ड देखें और देखें मॉडल
  • देखें बीच भेजा जाता है - एक यूआई जनरेटर जो मॉडल, कोड और एचटीएमएल को वेबपृष्ठ प्रस्तुत करने के लिए जोड़ता है
  • नियंत्रक - उपयोगकर्ता अनुरोध स्वीकार करता है, उन्हें व्याख्या करता है, आवेदन स्थिति अद्यतन करता है और एक HTML वेबपेज

मॉडल व्यावहारिक रूप से दोनों पैटर्न में एक ही है में इस राज्य कन्वर्ट करने के लिए एक दृश्य का उपयोग करता है। डेस्कटॉप मॉडल अद्यतन घटना अधिसूचनाओं को कार्यान्वित कर सकते हैं, वेब मॉडल गतिशील हो सकते हैं (यानी, दृढ़ता से टाइप नहीं किया गया), और दोनों सत्यापन विधियों या मेटाडेटा को शामिल या नहीं कर सकते हैं।

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

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

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

ये जावास्क्रिप्ट एमवीवीएम फ्रेमवर्क आमतौर पर ऊपर वर्णित डेस्कटॉप एमवीवीएम पैटर्न के समान पैटर्न का पालन करते हैं, लेकिन एचटीएमएल डोम और जावास्क्रिप्ट की प्रकृति के साथ काम करने के लिए समायोजित किए जाते हैं। उदाहरण के लिए, डीओएम में बुनाई जाने वाली कोई व्यापक बाध्यकारी प्रणाली नहीं है, और जावास्क्रिप्ट में बहुत सीमित प्रकार की प्रणाली है, इसलिए मॉडलों के लिए टेम्पलेट्स मिलान करना WPF से काफी अलग है। वे आम तौर पर सर्वर से डिस्कनेक्ट भी काम करते हैं, और जब उन्हें बातचीत करने की आवश्यकता होती है, तो पृष्ठ को वापस नियंत्रक को पोस्ट करने के बजाय AJAX कॉल पसंद करते हैं (AJAX कॉल आमतौर पर एएसपी.नेट एमवीसी में वेबएपीआई नियंत्रकों द्वारा संभाला जाता है)।

तो संक्षेप में, एमवीसी में वास्तव में एक दृश्य मॉडल नहीं है। नियंत्रक किसी न किसी समकक्ष है, लेकिन यह उपयोगकर्ता इनपुट प्राप्त करने में बहुत अलग है, इसका अर्थ है, और उपयोगकर्ता को परिणाम देता है। एमवीसी में किसी भी चीज़ का संदर्भ देने के लिए "मॉडल देखें" शब्द का उपयोग केवल भ्रम पैदा कर सकता है, और इसलिए इससे बचा जाना चाहिए। पैटर्न के उचित भागों के लिए उचित शर्तों का प्रयोग करें। यह pedantic प्रतीत हो सकता है, लेकिन यह चीजों को स्पष्ट रखने में मदद करनी चाहिए और उन दोनों लोगों के लिए कम भ्रमित होना चाहिए जो दोनों पैटर्न के लिए नए हैं।

+0

क्षमा करें, लेकिन मुझे विश्वास है कि यह गलत है और भ्रम में योगदान देता है जो वीएम और एमवीसी के साथ आता है। ऊपर दिए गए एडम्स का जवाब एक पंक्ति में सही है: "एमवीसी में, व्यूमोडेल एक दृश्य के लिए आवश्यक सभी जानकारी प्रदान करता है।" IOW, नियंत्रक में वीएम का कोई हिस्सा मौजूद नहीं है। एक नियंत्रक एक वीएम के बराबर एक कार्यात्मक नहीं है। एक वीएम एक अच्छी तरह से परिभाषित वस्तु है जिसमें दृश्य प्रस्तुत करने के लिए आवश्यक सभी गुण होते हैं। मैं समझाता हूं कि उन्हें यहां कैसे बनाया जाए: http://stackoverflow.com/questions/11064316/what-is-viewmodel-in-mvc/29135747#29135747 – Sam

+0

@ सैम तो कंट्रोलर, व्यूमोडेल की तरह, उपयोगकर्ता क्रियाओं की व्याख्या नहीं करता है , उन्हें व्यापार तर्क में अनुवादित करें, और इन कार्यों के परिणामों को प्रस्तुत करने के लिए दृश्यों को वापस कर दें? – Will

+0

बिलकुल नहीं! नियंत्रक का काम एक अनुरोध को देखने के लिए है। और एक और बात नहीं। नियंत्रक आमतौर पर काफी छोटे होते हैं (गूगल "पतला नियंत्रक")। वीएम का काम पूरी तरह से अलग है और नियंत्रक से असंबंधित है। वीएम का काम ऑब्जेक्ट्स और सेवाओं को एक ऑब्जेक्ट में इकट्ठा करना है जो एक प्रतिपादन इंजन को प्रस्तुत करने से है ताकि दृश्य बनाया जा सके। वीएम में उपयोगकर्ता (एनिमेट, रंगीन, छुपाएं/शो इत्यादि) के साथ बातचीत करने के लिए तर्क शामिल है और दृश्य की ओर से आवश्यक व्यावसायिक सेवाओं को कॉल करता है। – Sam

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