2011-05-31 14 views
22

के साथ उलझन में मैं एएसपी.नेट एमवीसी सीख रहा हूं और कुछ नमूना ऐप्स डाउनलोड कर रहा हूं। म्यूजिकस्टोर इत्यादि ...मॉडल बनाम व्यूमोडेल

मैं एक डब्ल्यूपीएफ पृष्ठभूमि से आ रहा हूं जहां हमारे पास एमवीवीएम पैटर्न था। मैंने देखा है कि उन्होंने मॉडल और व्यूमोडेल की अवधारणा का उपयोग किया था।

एमवीवीएम में यह स्पष्ट है कि आप दृश्य मॉडल में मॉडल को इंजेक्शन करने के लिए व्यूमोडेल को दृश्य को बाध्य करते हैं। MVC में आप एक नियंत्रक है, लेकिन मुझे यकीन है कि नहीं कर रहा हूँ और कैसे सारे रिश्ते एक साथ उलझन में, जैसा कि मैंने मॉडल ViewModel में इंजेक्शन नहीं देख सकते हैं

मैं निम्नलिखित संरचना

  1. MyCompany.Entities.dll है (सभी मॉडलों यहाँ जाना) ईजी उत्पाद
  2. MyCompany.Dal.dll (सभी खजाने यहाँ जाना)
  3. MyCompany.Services.dll (MyCompany.WebUI.Controller से बुलाया कॉल MyCompany.Dal)
  4. MyCompany। WebUI.MyApp
  5. MyCompany.Tests

उदाहरण मैं एक ViewModel.Am मैं सही रूप में अपने मॉडल में कार्य करता है देखा है में से कुछ से?

के एक नियंत्रक लेते हैं मैं उसमें डेवलपर मैं उल्लेख कर सकते हैं कुछ एन स्तरीय उदाहरण है की तरह

public class ProductController 
{ 
    public ProductController(IProductRepository productRepository) 
    { 
     //omitted as not relevant 
    } 
} 
public class ProductVM 
{ 
    public ProductVM() 
    { 
     // Shouldn't we inject the model here RG Product 
    } 
} 

कुछ है? क्या व्यूमोडेल की अवधारणा एमवीसी में मान्य है? मानक क्या है?

किसी भी सुझाव के लिए धन्यवाद।

उत्तर

32

व्यूमोडल्स से दृश्य को सरल बनाएं।

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

एक व्यूमोडेल एक ऑब्जेक्ट में दृश्य के लिए आवश्यक जानकारी को एकत्रित करने का एक तरीका प्रदान करता है।

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

लेकिन हकीकत में, ViewModels आपके डोमेन ऑब्जेक्ट्स के लिए एक साधारण रैपर से अधिक कुछ नहीं है।

ऑटोमैपर जैसे टूल का उपयोग अपने व्यू मॉडल्स और डोमेन मॉडल के बीच आसानी से मैप करने के लिए करें।

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

आप बस अपने डोमेन मॉडल की 1-1 से प्रतिनिधित्व के साथ एक वस्तु है, तो आप ViewModels की बात को अनदेखा कर रहे हैं।

केवल ViewModels में जोड़े, और ज्यादा कुछ नहीं, क्या एक विशेष दृश्य के लिए आवश्यक है।

उदाहरण नियंत्रक कार्रवाई

public ActionResult CustomerInfo(int customerId) 
{ 
    // Fetch the customer from the Repository. 
    var customer = _repository.FindById(customerId); 

    // Map domain to ViewModel. 
    var model = Mapper.Map<Customer,CustomerViewModel>(customer); 

    // Return strongly-typed view. 
    return View(model); 
} 
+2

हाय, आपके उत्तर के लिए धन्यवाद, आप कह रहे हैं: हम न हमारे webApp.We अंदर मॉडल ViewModels कि नियंत्रकों के लिए संदर्भित करता है और फिर हम डोमेन "मॉडल" इंजेक्षन ViewModel में, हम एनोटेशन जोड़ सकते हैं ताकि और राशि हमारे ViewModels के लिए सत्यापन। क्या आपके पास कहीं एक त्वरित उदाहरण है या हमारे लिंक को संरचित किया गया है? मैं बहुत आभारी हूं। धन्यवाद – user9969

+1

यह ** बिल्कुल ** ** मैं क्या कह रहा हूं - इसे एक वाक्य में संक्षेप में किया गया है। अब निश्चित रूप से, आपके वेब एप्लिकेशन को अभी भी डोमेन मॉडल असेंबली ** संदर्भ ** की आवश्यकता होगी, क्योंकि इसे उनके बीच आगे और आगे मैप करने की आवश्यकता है। लेकिन किकर आपके विचारों को आपके डोमेन मॉडल के बारे में कोई जानकारी नहीं है, वे ViewModels से जुड़ते हैं। यहां बेकार उदाहरण: http://weblogs.asp.net/shijuvarghese/archive/2010/02/01/view-model-pattern-and-automapper-in-asp-net-mvc-applications.aspx। बस "asp.net mvc view मॉडल पैटर्न" के लिए Google पर जाएं – RPM1984

+0

मैंने ऑटोमैपर के साथ एक बहुत ही सरल उदाहरण भी जोड़ा। – RPM1984

1

MVC और MVVM के बीच का अंतर MVC डेटा संस्थाओं के लिए वर्गों में से एक सेट किया है। एमवीवीएम में आपके पास 2 विचार हैं - आपके विचारों के लिए बाध्यकारी, और डेटा दृढ़ता के प्रबंधन के लिए एक सेट (जो उदाहरण के लिए एक अलग डब्ल्यूसीएफ सेवा में हो सकता है)।

MVVM के क्या लाभ हैं कि मॉडल विचारों के लिए बाध्य यूआई के लिए प्रासंगिक है और हठ मॉडल से पूरी तरह से स्वतंत्र।

कौन सा उपयोग करने के लिए? वैसे यह इस बात पर निर्भर करता है कि डेटाबेस के ढांचे पर आपके दृश्य मानचित्रों द्वारा डेटा संरचना की कितनी बारीकी से आवश्यकता है। जब यह समान होता है - डेटा डीएनटी से सीधे डेटा को अपने डीएएल से बांधना संभव है - यह क्लासिक एमवीसी पैटर्न है। हालांकि, आप एक अलग व्यूमोडेल के साथ बहुत अधिक लाभ प्राप्त करते हैं क्योंकि आप इन वर्गों को विशिष्ट विशिष्ट व्यवहार (उदा। सत्यापन) के साथ बढ़ा सकते हैं कि आपके डीएएल से कोई संबंध नहीं होना चाहिए।

सभी लेकिन सबसे सरल अनुप्रयोगों के लिए, मैं एक अलग ViewModel के उपयोग की सिफारिश करेंगे।

+0

आपके उत्तर के लिए हाय धन्यवाद। मेरे विचारों को डेटाबेस का कोई अंदाजा नहीं होगा। वे एक "व्यू मॉडेल" और उन सेवा परतों को कॉल करेंगे और वहां से एक DAL.All इंटरफेस के माध्यम से। आप जो कह रहे हैं उससे एमवीवीएम वास्तव में एमवीसी में उपयोग करने का पैटर्न है। क्या यह आप क्या कह रहे हैं? – user9969

+0

क्षमा करें - मेरा अंतिम वाक्य भ्रमित - मेरा मतलब डेटाबेस के संदर्भ में नहीं देखा गया - मैं अपडेट करूंगा। मेरा मतलब है कि डेटाबेस में उपयोग किए गए व्यूमोडेल मैचों में संरचना की कितनी बारीकी से आवश्यकता है। लेकिन आपके प्रश्न के उत्तर में - हाँ - आपके मामले में एक व्यूमोडेल मेरी पसंद होगी। – BonyT

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