संपादित करें: मैंने अपने ब्लॉग पर इस उत्तर को अपडेट किया:
http://www.samwheat.com/post/The-function-of-ViewModels-in-MVC-web-development
मेरा जवाब थोड़ा लंबा है, लेकिन मुझे लगता है कि यह समझने के लिए कि सामान्य रूप से उपयोग किए जाने वाले मॉडल के अन्य प्रकार के दृश्य मॉडल की तुलना करना महत्वपूर्ण है कि वे अलग क्यों हैं और वे क्यों आवश्यक हैं।
संक्षेप में, और सीधे पूछे जाने वाले प्रश्न का उत्तर देने के लिए:
सामान्यतया, एक दृश्य मॉडल एक ऐसी वस्तु है जिसमें किसी दृश्य को प्रस्तुत करने के लिए आवश्यक सभी गुण और विधियाँ शामिल हैं। मॉडल के गुण अक्सर ग्राहक और ऑर्डर जैसी डेटा ऑब्जेक्ट से संबंधित होते हैं और इसके अलावा वे पृष्ठ या एप्लिकेशन से संबंधित गुण भी होते हैं जैसे उपयोगकर्ता नाम, एप्लिकेशन का नाम आदि। देखें मॉडल एक रेंडरिंग इंजन को पास करने के लिए एक सुविधाजनक ऑब्जेक्ट प्रदान करते हैं। एक html पेज बनाएं। एक दृश्य मॉडल का उपयोग करने के कई कारणों में से एक यह है कि दृश्य मॉडल कुछ प्रस्तुति कार्यों को यूनिट टेस्ट करने का एक तरीका प्रदान करते हैं जैसे उपयोगकर्ता इनपुट को संभालना, डेटा को मान्य करना, प्रदर्शन के लिए डेटा पुनर्प्राप्त करना आदि।
यहां एंटिटी मॉडल (a.ka. DTO's a.ka. मॉडल), प्रस्तुति मॉडल और व्यू मॉडल की तुलना की गई है।
डेटा ट्रांसफर ऑब्जेक्ट्स उर्फ "मॉडल"
डेटा ट्रांसफर ऑब्जेक्ट (डीटीओ) एक वर्ग का गुण है जो डेटाबेस में टेबल स्कीमा से मेल खाता है। डीटीओ को डेटा स्टोर से डेटा को बंद करने के लिए उनके सामान्य उपयोग के लिए नामित किया गया है।
डीटीओ के लक्षण:
• व्यावसायिक वस्तुएं हैं - उनकी परिभाषा अनुप्रयोग डेटा पर निर्भर है।
• आमतौर पर केवल गुण होते हैं - कोई कोड नहीं।
• मुख्य रूप से डेटाबेस से डेटा को ट्रांसपोर्ट करने के लिए उपयोग किया जाता है।
• गुण डेटा स्टोर में किसी विशिष्ट तालिका पर फ़ील्ड के ठीक या निकट से मेल खाते हैं।
डेटाबेस तालिकाओं को आमतौर पर सामान्यीकृत किया जाता है इसलिए डीटीओ आमतौर पर भी सामान्यीकृत होते हैं। यह उन्हें डेटा प्रस्तुत करने के लिए सीमित उपयोग करता है। हालांकि, कुछ सरल डेटा संरचनाओं के लिए वे अक्सर काफी अच्छा करते हैं।
यहाँ दो उदाहरण हैं जो डीटीओ की तरह दिख सकते हैं:
public class Customer
{
public int ID { get; set; }
public string CustomerName { get; set; }
}
public class Order
{
public int ID { get; set; }
public int CustomerID { get; set; }
public DateTime OrderDate { get; set; }
public Decimal OrderAmount { get; set; }
}
प्रस्तुति मॉडल
एक प्रस्तुति मॉडल एक उपयोगिता वर्ग है जिसका उपयोग स्क्रीन या रिपोर्ट पर डेटा प्रस्तुत करने के लिए किया जाता है। प्रस्तुति मॉडल आमतौर पर जटिल डेटा संरचनाओं को मॉडल करने के लिए उपयोग किया जाता है जो कि कई डीटीओ के डेटा से तैयार किए जाते हैं। प्रस्तुति मॉडल अक्सर डेटा के एक असामान्य दृष्टिकोण का प्रतिनिधित्व करते हैं।
प्रस्तुति मॉडल के लक्षण:
• व्यावसायिक वस्तुएं हैं - उनकी परिभाषा अनुप्रयोग डेटा पर निर्भर है।
• ज्यादातर संपत्तियां होती हैं। कोड आमतौर पर स्वरूपण डेटा या डीटीओ से या में परिवर्तित करने तक सीमित है। प्रस्तुति मॉडल में व्यावसायिक तर्क नहीं होना चाहिए।
• अक्सर डेटा का एक असामान्य दृष्टिकोण प्रस्तुत करते हैं। यही है, वे अक्सर कई डीटीओ के गुणों को जोड़ते हैं।
• अक्सर डीटीओ की तुलना में एक अलग आधार प्रकार के गुण होते हैं। उदाहरण के लिए डॉलर की मात्रा को स्ट्रिंग्स के रूप में दर्शाया जा सकता है ताकि वे कॉमा और एक मुद्रा प्रतीक हो सकें।
• अक्सर परिभाषित किया जाता है कि उनका उपयोग कैसे किया जाता है और साथ ही साथ उनकी वस्तु विशेषताओं का उपयोग किया जाता है। दूसरे शब्दों में, ग्रिड को प्रस्तुत करने के लिए बैकिंग मॉडल के रूप में उपयोग किया जाने वाला एक सरल डीटीओ वास्तव में उस ग्रिड के संदर्भ में एक प्रस्तुति मॉडल है।
प्रस्तुति मॉडल का उपयोग "आवश्यकतानुसार" और "जहाँ आवश्यक हो" (जबकि डीटीओ आमतौर पर डेटाबेस स्कीमा से जुड़ा होता है) किया जाता है। एक प्रस्तुति मॉडल का उपयोग पूरे पृष्ठ के लिए डेटा, एक पृष्ठ पर एक ग्रिड, या एक पृष्ठ पर एक ग्रिड पर एक ड्रॉपडाउन मॉडल के लिए किया जा सकता है। प्रस्तुति मॉडल में अक्सर ऐसे गुण होते हैं जो अन्य प्रस्तुति मॉडल होते हैं। प्रस्तुति मॉडल अक्सर एकल-उपयोग के उद्देश्य के लिए बनाए जाते हैं जैसे कि एक पृष्ठ पर एक विशिष्ट ग्रिड को प्रस्तुत करना।
एक उदाहरण प्रस्तुति मॉडल:
public class PresentationOrder
{
public int OrderID { get; set; }
public DateTime OrderDate { get; set; }
public string PrettyDate { get { return OrderDate.ToShortDateString(); } }
public string CustomerName { get; set; }
public Decimal OrderAmount { get; set; }
public string PrettyAmount { get { return string.Format("{0:C}", OrderAmount); } }
}
मॉडल देखें
एक दृश्य मॉडल एक प्रस्तुति मॉडल के समान है जिसमें एक दृश्य प्रस्तुत करने के लिए एक समर्थन वर्ग है। हालांकि यह एक प्रेजेंटेशन मॉडल या डीटीओ से अलग है कि इसका निर्माण कैसे किया जाता है। दृश्य मॉडल में अक्सर प्रस्तुति मॉडल और डीटीओ के समान गुण होते हैं और इस कारण से वे अक्सर एक दूसरे के लिए भ्रमित होते हैं।
दृश्य मॉडल के लक्षण:
• पृष्ठ या स्क्रीन को रेंडर करने के लिए उपयोग किए जाने वाले डेटा का एकल स्रोत हैं। आमतौर पर इसका मतलब है कि एक दृश्य मॉडल प्रत्येक संपत्ति को उजागर करेगा जो पृष्ठ पर किसी भी नियंत्रण को खुद को सही ढंग से प्रस्तुत करने की आवश्यकता होगी। दृश्य मॉडल को दृश्य के लिए डेटा का एकल स्रोत बनाने से इकाई परीक्षण के लिए इसकी क्षमता और मूल्य में काफी सुधार होता है।
• कंपोजिट ऑब्जेक्ट्स होते हैं जिनमें ऐसे गुण होते हैं जो एप्लिकेशन डेटा के साथ-साथ उन गुणों से युक्त होते हैं जो एप्लिकेशन कोड द्वारा उपयोग किए जाते हैं। पुन: प्रयोज्य के लिए दृश्य मॉडल डिजाइन करते समय यह विशेषता महत्वपूर्ण है और नीचे दिए गए उदाहरणों में चर्चा की गई है।
• कंटेनर कोड। देखें मॉडल में आमतौर पर ऐसे तरीके होते हैं जो रेंडरिंग के दौरान कहलाते हैं और जब उपयोगकर्ता पेज के साथ इंटरैक्ट कर रहा होता है। यह कोड आमतौर पर ईवेंट हैंडलिंग, एनीमेशन, नियंत्रण की दृश्यता, स्टाइलिंग आदि से संबंधित है।
• डेटा प्राप्त करने या डेटाबेस सर्वर पर भेजने के उद्देश्य से व्यावसायिक सेवाओं को कॉल करने वाले कोड को शामिल करें। इस कोड को अक्सर गलती से एक नियंत्रक में रखा जाता है। एक नियंत्रक से व्यावसायिक सेवाओं को कॉल करना आमतौर पर इकाई परीक्षण के लिए दृश्य मॉडल की उपयोगिता को सीमित करता है। स्पष्ट होने के लिए, मॉडल को स्वयं व्यावसायिक तर्क नहीं होना चाहिए, लेकिन उन सेवाओं पर कॉल करना चाहिए जिनमें व्यावसायिक तर्क शामिल हैं।
• अक्सर ऐसे गुण होते हैं जो अन्य पृष्ठों या स्क्रीन के लिए अन्य दृश्य मॉडल होते हैं।
• "प्रति पृष्ठ" या "प्रति स्क्रीन" लिखा जाता है। एक विशिष्ट दृश्य मॉडल आमतौर पर हर पृष्ठ या स्क्रीन के लिए एक अनुप्रयोग में लिखा जाता है।
• आमतौर पर एक बेस क्लास से प्राप्त होता है क्योंकि अधिकांश पृष्ठ और स्क्रीन सामान्य गुण साझा करते हैं।
मॉडल संरचना देखें
जैसा कि पहले कहा गया है, दृश्य मॉडल समग्र वस्तुएं हैं, जिसमें वे एक ही वस्तु पर अनुप्रयोग गुणों और व्यावसायिक डेटा गुणों को जोड़ती हैं। आमतौर पर उपयोग किए जाने वाले अनुप्रयोग गुणों के उदाहरण जो दृश्य मॉडल पर उपयोग किए जाते हैं:
• गुण जो अनुप्रयोग स्थिति को प्रदर्शित करने के लिए उपयोग किए जाते हैं जैसे त्रुटि संदेश, उपयोगकर्ता नाम, स्थिति, आदि।
• गुणों का उपयोग प्रारूपण, प्रदर्शन, शैलीकरण या चेतन नियंत्रण के लिए किया जाता है।
• डेटा बाइंडिंग के लिए उपयोग की जाने वाली संपत्तियाँ जैसे सूची ऑब्जेक्ट और गुण जो मध्यवर्ती डेटा को धारण करते हैं जो उपयोगकर्ता द्वारा इनपुट किया जाता है।
निम्नलिखित उदाहरण दिखाते हैं कि दृश्य मॉडलों की समग्र प्रकृति क्यों महत्वपूर्ण है और हम कैसे कुशल और पुन: प्रयोज्य दृश्य मॉडल का सर्वोत्तम निर्माण कर सकते हैं।
मान लें कि हम एक वेब एप्लिकेशन लिख रहे हैं। एप्लिकेशन डिज़ाइन की आवश्यकताओं में से एक यह है कि पृष्ठ का शीर्षक, उपयोगकर्ता नाम और एप्लिकेशन नाम प्रत्येक पृष्ठ पर प्रदर्शित होना चाहिए। यदि हम एक प्रस्तुति ऑर्डर ऑब्जेक्ट प्रदर्शित करने के लिए एक पेज बनाना चाहते हैं, तो हम प्रस्तुति मॉडल को निम्नानुसार संशोधित कर सकते हैं:
public class PresentationOrder
{
public string PageTitle { get; set; }
public string UserName { get; set; }
public string ApplicationName { get; set; }
public int OrderID { get; set; }
public DateTime OrderDate { get; set; }
public string PrettyDate { get { return OrderDate.ToShortDateString(); } }
public string CustomerName { get; set; }
public Decimal OrderAmount { get; set; }
public string PrettyAmount { get { return string.Format("{0:C}", OrderAmount); } }
}
यह डिज़ाइन काम कर सकता है ... लेकिन क्या होगा अगर हम एक ऐसा पेज बनाना चाहते हैं जो आदेशों की सूची प्रदर्शित करे? PageTitle, UserName, और ApplicationName गुण दोहराए जाएंगे और उनके साथ काम करने में अनिच्छुक हो जाएंगे। इसके अलावा, क्या होगा यदि हम कक्षा के निर्माण में कुछ पृष्ठ-स्तरीय तर्क को परिभाषित करना चाहते हैं? हम अब ऐसा नहीं कर सकते हैं कि यदि हम प्रत्येक आदेश के लिए एक उदाहरण बनाते हैं जो प्रदर्शित किया जाएगा।
वंशानुक्रम पर रचना
यहां एक तरीका है कि हम ऑर्डर प्रेजेंटेशन मॉडल को फिर से फैक्टर कर सकते हैं जैसे कि यह एक सच्चा व्यू मॉडल बन जाता है और यह एक प्रेजेंटेशनऑडर ऑब्जेक्ट या प्रेजेंटेशनऑर्डर ऑब्जेक्ट्स के कलेक्शन को प्रदर्शित करने के लिए उपयोगी होगा:
public class PresentationOrderVM
{
// Application properties
public string PageTitle { get; set; }
public string UserName { get; set; }
public string ApplicationName { get; set; }
// Business properties
public PresentationOrder Order { get; set; }
}
public class PresentationOrderVM
{
// Application properties
public string PageTitle { get; set; }
public string UserName { get; set; }
public string ApplicationName { get; set; }
// Business properties
public List<PresentationOrder> Orders { get; set; }
}
उपरोक्त दो वर्गों को देखते हुए हम देख सकते हैं कि एक दृश्य मॉडल के बारे में सोचने का एक तरीका यह है कि यह एक प्रस्तुति मॉडल है जिसमें संपत्ति के रूप में एक और प्रस्तुति मॉडल शामिल है। शीर्ष स्तर की प्रस्तुति मॉडल (अर्थात दृश्य मॉडल) में ऐसे गुण होते हैं जो पृष्ठ या एप्लिकेशन के लिए प्रासंगिक होते हैं जबकि प्रस्तुति मॉडल (संपत्ति) में ऐसे गुण होते हैं जो एप्लिकेशन डेटा के लिए प्रासंगिक होते हैं।
हम अपने डिजाइन को एक कदम आगे ले जा सकते हैं और एक बेस व्यू मॉडल क्लास बना सकते हैं जिसका इस्तेमाल न केवल प्रेजेंटेशन ऑर्डर्स के लिए किया जा सकता है, बल्कि किसी अन्य क्लास के लिए भी किया जा सकता है:
public class BaseViewModel
{
// Application properties
public string PageTitle { get; set; }
public string UserName { get; set; }
public string ApplicationName { get; set; }
}
अब हम अपनी प्रस्तुति को इस तरह सरल बना सकते हैं:
public class PresentationOrderVM : BaseViewModel
{
// Business properties
public PresentationOrder Order { get; set; }
}
public class PresentationOrderVM : BaseViewModel
{
// Business properties
public List<PresentationOrder> Orders { get; set; }
}
हम अपने BaseViewModel को सामान्य बनाकर और भी अधिक प्रयोग करने योग्य बना सकते हैं:
public class BaseViewModel<T>
{
// Application properties
public string PageTitle { get; set; }
public string UserName { get; set; }
public string ApplicationName { get; set; }
// Business property
public T BusinessObject { get; set; }
}
अब हमारे कार्यान्वयन सरल हैं:
public class PresentationOrderVM : BaseViewModel<PresentationOrder>
{
// done!
}
public class PresentationOrderVM : BaseViewModel<List<PresentationOrder>>
{
// done!
}