2009-07-08 10 views
13

मैंने एमवीवीएम पर एमएसडीएन लेख पढ़ा है और मैं वास्तव में आश्वस्त नहीं हूं। यदि मॉडल पहले से ही लागू करता है IotifyPropertyChanged/INotifyCollectionChanged, मॉडल के खिलाफ सीधे बाध्यकारी दृश्य में क्या गलत है? ऐसा लगता है कि अतिरिक्त मॉडल व्यू बिना किसी लाभ के कुछ कोड पेश करता है। क्या मुझे कुछ याद आ रही है?क्या एमवीवीएम वास्तव में उपयोगी है?

उत्तर

12

मैं भी थोड़ा सा संदेह था एमवीवीएम जब तक मैंने जेसन डॉलिंगर द्वारा यह great presentation देखा। मैं अपने सभी सहकर्मियों को सलाह देता हूं जो इसे देखने के लिए डब्ल्यूपीएफ और एमवीवीएम में शुरू कर रहे हैं।

जेसन एक आवेदन है कि एक एक "पारंपरिक" तरह से लिखते थे, में घटना संचालकों द्वारा नियंत्रित बटन क्लिक के साथ के साथ शुरू किया कोड-पीछे यूआई की कि फिर अपडेट की गई अन्य भागों। डब्ल्यूपीएफ डेटा-बाध्यकारी, कमांड, और यूनिटी का उपयोग करके, उन्होंने इसे टुकड़ा के टुकड़े में बदल दिया, encapsulated, पठनीय और टेस्टेबल एम-वी-वीएम डिज़ाइन। बहुत बढ़िया था।

अधिक सीधे आपके सवाल का जवाब करने के लिए, भले ही वह एक ViewModel करने के लिए बाध्य करने के लिए जब अपने मॉडल पहले से ही सब कुछ है मूर्खतापूर्ण लगता है, तो आप अक्सर मॉडल है कि केवल दृश्य द्वारा आवश्यक है करने के लिए एक छोटी सी समायोजन की आवश्यकता होगी, हवा हूँ। समय के साथ, ये छोटे बदलाव आपके मॉडल में रेंगेंगे, जहां वे संबंधित नहीं हैं। यह आपके मॉडल को जितना होना चाहिए उससे ज्यादा जटिल बना देगा।

जब मैं मॉडल करता हूं तो "मैं यह सब करता हूं", मैं एक व्यूमोडेल जोड़ता हूं जिसमें एक संपत्ति, मॉडल शामिल होता है। फिर मेरे बाइंडिंग में मैं बस मॉडल से बांधता हूं। मॉडल, मॉडल। एज, आदि। यह वास्तव में कोई प्रयास नहीं है। बाद में, अगर मुझे केवल दृश्य के लिए tweaks की आवश्यकता है, तो मेरे पास पहले से ही मेरा व्यूमोडेल क्लास तैयार है। यह आपके कोड को और अधिक सहज और समझने में आसान बनाता है। आपको आश्चर्य नहीं होगा, क्या मैंने इस मामले में मॉडल या व्यूमोडेल से बंधे थे? यह हमेशा ViewModel होगा।

+0

जब मैंने एमवीवीएम के साथ शुरुआत की तो मैं भी संदेहजनक था तब मैंने उस वीडियो को देखा और अब यह मेरे डब्ल्यूपीएफ ऐप्स के साथ एमवीवीएम के कुछ रूपों का उपयोग नहीं कर रहा है। जोश स्मिथ द्वारा क्रैक.नेट के स्रोत को पढ़ने में भी बहुत मदद मिली। –

+0

वह लिंक अब मौजूद नहीं है। –

6

INotifyPropertyChanged और INotifyCollectionChanged विचार करने वाले एकमात्र पहलू नहीं हैं ... कई मामलों में, मॉडल द्वारा खुलासा डेटा आसानी से उपयोग योग्य नहीं होगा। व्यूमोडेल की भूमिका मॉडल और दृश्य के बीच एक एडाप्टर के रूप में कार्य करना है: डेटा को उस रूप में बेनकाब करें जो दृश्य को आसानी से बांधने की अनुमति देता है, कार्यों को निष्पादित करने के लिए दृश्यों को बेनकाब कर सकता है ... आम तौर पर, एक मॉडल ICommand एस का पर्दाफाश नहीं करेगा: यदि ऐसा होता है, तो मॉडल WPF- विशिष्ट है, जो कभी भी अच्छी बात नहीं है कि आप किसी अन्य गैर-WPF अनुप्रयोग में पुन: उपयोग करना चाहते हैं ...

मेरे पास है कुछ महीनों के लिए एमवीवीएम का उपयोग कर रहा है, और इसने मेरे जीवन को बहुत आसान बना दिया: कोड-बैक फाइलों में "स्पेगेटी कोड", ज़िम्मेदारियों को अलग करने, स्वच्छ समग्र वास्तुकला को साफ़ करने के लिए ...

6

2 परियोजनाओं के लिए MVVM कुछ चीजें है कि मैं ViewModel में कर रहे हैं उपयोग किया गया है और यहाँ कर रहे हैं:

  • (मॉडल से डेटा को बदलने जब आप एक ViewModel का उपयोग कर रहे हैं, यह जीवन में आता है आसान जब यूआई विनिर्देशों बदलने के लिए, आप मॉडल को बदलने की जरूरत नहीं है/हठ कोड)
  • मॉडल
  • कार्यान्वयन आदेश
  • कैशिंग द्वारा प्रदान की एक संग्रह पर एक ICollectionView का कार्यान्वयन (डेटा की गणना करने के लिए महंगे बनाए रखने)
  • मॉडल डेटा पर एक शब्दकोश (तेजी से देखने के लिए)
  • लेज़ी लोडिंग (जब तक यह देखें द्वारा इस्तेमाल किया गया है लोड नहीं)
  • प्रबंध पूर्ववत करें/फिर
  • डेटा की मान्यता (IDataErrorInfo)
को बनाए रखने

और वहाँ करने के लिए बहुत कुछ है (जो मैं भूल गया) जो मॉडल में स्वयं फिट नहीं होगा, या यूजर इंटरफेस स्पेगेटी बना देगा।

भूलना नहीं है, ViewModel आपको उन चीजों का परीक्षण करने में सक्षम बनाता है जिन्हें आप परीक्षण करने में सक्षम नहीं होंगे अगर यह यूआई (जैसे कमांड) में लागू किया गया था।

अंत में, एमवीवीएम का उपयोग करके, मैं व्यूमोडल्स का उपयोग करके अपने एप्लिकेशन का एक कमांड लाइन संस्करण बनाने में सक्षम था।

2

मैं कुछ वर्षों से एमईएफ के साथ एमवीवीएम का उपयोग कर रहा हूं और वास्तव में यह सुनिश्चित नहीं करता कि यह वास्तव में कितना उपयोगी है। हमारे विकास में हम अलग-अलग दृश्यों के लिए व्यूमोडल्स का पुन: उपयोग नहीं करते हैं, न ही हमारे पास ऐसे डिज़ाइनर हैं जिन्हें केवल दृश्य (UI) को बदलने की अनुमति है।

और व्यूमोडेल में कई चीजों को हासिल करना मुश्किल है, जैसे व्यूमोडेल में परिवर्तनों के आधार पर कर्सर फोकस सेट करना (हाँ, यह संभव है, लेकिन कोड में बहुत अधिक अव्यवस्था जोड़ता है)।

एमवीवीएम के बारे में अच्छी बात यह है कि फ़ील्ड को सीधे सेट करने के बजाए बाध्यकारी के रूप में मूल्यों और आज्ञाओं का आयोजन किया जा रहा है, लेकिन यह व्यूमोडेल के बिना किया जा सकता है।

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