2009-12-30 18 views
78

मैं अपने डोमेन ऑब्जेक्ट्स को जारी रखने के लिए NHibernate का उपयोग कर रहा हूं। चीजों को सरल रखने के लिए मैं अपनी प्रस्तुति परत, और मेरी सेवा परत दोनों के रूप में एक एएसपी.नेट एमवीसी प्रोजेक्ट का उपयोग कर रहा हूं।डीटीओ = व्यूमोडेल?

मैं अपने डोमेन ऑब्जेक्ट्स को अपने नियंत्रक वर्गों से एक्सएमएल में वापस करना चाहता हूं। स्टैक ओवरफ्लो पर कुछ पोस्ट पढ़ने के बाद मैं इकट्ठा करता हूं डीटीओ जाने का रास्ता है। हालांकि, मैं ViewModel के बारे में बात करने वाली पोस्ट में भी आया हूं।

मेरा प्रश्न: क्या डाटा ट्रांसफर ऑब्जेक्ट्स और व्यू मॉडेल एक ही चीज़ हैं? या एक व्यूमोडेल एक डीटीओ का एक प्रकार का उप पैटर्न है?

+7

मुझे लगता है कि यह है कि ASP.NET MVC में ViewModels के रूप में सबसे जवाब MVVM उल्लेख है और आप ASP.NET MVC के साथ काम कर रहे हैं, WPF (MVVM) में ViewModels के लिए 100% समान नहीं होते हैं उल्लेख करने के लिए प्रासंगिक है। –

उत्तर

73

किसी डीटीओ की कैननिकल परिभाषा किसी ऑब्जेक्ट का डेटा आकार किसी व्यवहार के बिना है।

व्यू मॉडेल दृश्य का मॉडल हैं। व्यूमोडल्स आम तौर पर एक या अधिक ऑब्जेक्ट्स (या डीटीओ) से पूर्ण या आंशिक डेटा होते हैं, साथ ही व्यू के व्यवहार के लिए विशिष्ट कोई भी अतिरिक्त सदस्य (दृश्य द्वारा निष्पादित किए जा सकने वाले तरीकों, गुणों को टॉगल करने का तरीका इंगित करने के लिए गुण ...)। आप व्यूमोडेल को व्यू प्लस व्यवहार के लिए सभी डेटा के रूप में देख सकते हैं। ViewModels व्यावसायिक वस्तुओं या डीटीओ में एक से एक को मैप या नहीं कर सकता है।

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

6

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

मेरे लिए यह तीव्रता के बीच संतुलन है (डीटीओ का उपयोग करके, क्योंकि मेरे पास पहले से ही है) और लचीलापन (व्यूमोडल्स बनाने का मतलब चिंता का अधिक अलगाव है)।

+2

अच्छा व्यावहारिक उत्तर। –

27

डीटीओ! = ViewModel

MVVM पैटर्न में ViewModel दृश्य से मॉडल को अलग करने के लिए किया जाता है। मॉडल का प्रतिनिधित्व करने के लिए आप सरल DTO कक्षाओं का उपयोग कर सकते हैं, जिसे फिर से डेटाबेस के माध्यम से मैप किया गया है। NHibernate। लेकिन मैंने कभी भी व्यूमोडेल क्लास नहीं देखा है जिसे डीटीओ के रूप में मॉडलिंग किया गया है .. व्यू मॉडेल क्लास में ज्यादातर व्यवहार होता है, जो डीटीओ के पास नहीं होता है।

+2

तो डीटीओ सिर्फ structs हो सकता है (या एक वर्ग है जो एक संरचना की क्षमताओं की नकल करना चाहिए)? –

16

डीटीओ - डाटा ट्रांसफर ऑब्जेक्ट्स ठीक कहता है, डेटा स्थानांतरित करने के लिए कंटेनर। उनके पास कोई व्यवहार नहीं है बल्कि केवल सेटर्स और गेटर्स का एक गुच्छा है। कुछ लोग उन्हें अपरिवर्तनीय बनाते हैं और मौजूदा लोगों को अपडेट करने के बजाए केवल नए बनाते हैं। वे तार भर में स्थानांतरण की अनुमति देने के लिए serializable होना चाहिए।

आम तौर पर डीटीओ का उपयोग प्रक्रिया परतों में एक परत से दूसरे परत तक डेटा भेजने के लिए किया जाता है क्योंकि रिमोट सेवा पर कॉल महंगा हो सकता है, इसलिए सभी आवश्यक डेटा को डीटीओ में धकेल दिया जाता है और क्लाइंट को एक हिस्से में स्थानांतरित किया जाता है (मोटे अनाज)।

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

http://blog.jpboodhoo.com/CommentView,guid,21fe23e7-e42c-48d8-8871-86e65bcc9a50.aspx

साधारण मामलों में के रूप में पहले से ही इस डीटीओ देखने के लिए बाध्य करने के लिए, लेकिन अधिक जटिल मामलों में इस्तेमाल किया जा सकता यह ViewModel करने के लिए एक ViewModel के निर्माण और डीटीओ से डेटा की उतराई है जो की आवश्यकता होगी कहा गया है स्पष्ट रूप से अधिक काम (एमवीवीएम पैटर्न लागू करते समय)।

तो फिर के रूप में पहले ही कहा गया डीटीओ! = ViewModel

और

डीटीओ और ViewModel जीवन में विभिन्न प्रयोजन हो

46

ViewModel ASP.NET में MVC अभ्यास के रूप में एक ही है डीटीओ, हालांकि एमवीवीएम पैटर्न में व्यूमोडेल डीटीओ से अलग है क्योंकि एमवीवीएम में व्यूमोडेल के व्यवहार हैं लेकिन डीटीओ के पास नहीं है।

+4

यह एक अच्छा जवाब है; हालांकि विवरण पर कम। – Phil

+3

एएसपीनेट एमवीसी में व्यूमोडेल को डीटीओ के समान क्यों होना चाहिए? इसका कोई अर्थ नही बन रहा है। एक व्यूमोडेल का व्यवहार डीटीओ नहीं हो सकता है। यह एमवीसी पर निर्भर नहीं है। ASP.NET MVC ViewModel और MVVM ViewModel के बीच अंतर करने के लिए – Elisabeth

+4

+1। – Ronald

10

पहले, प्रमुख अंतर ViewModel व्यवहार या तरीकों हो सकता है यह है कि डीटीओ नहीं होना चाहिए !!!

दूसरा, एएसपी.नेट एमवीसी में व्यूमोडेल के रूप में डीटीओ का उपयोग करना आपके आवेदन को डीटीओ के साथ कसकर जोड़ता है और यह डीटीओ का उपयोग करने का बिल्कुल विरोध करने का उद्देश्य है। यदि आप ऐसा करते हैं, तो आपके डोमेन मॉडल या डीटीओ का उपयोग करके भिन्नता क्या है, विरोधी पैटर्न प्राप्त करने के लिए अधिक जटिलता?

इसके अलावा ASP.NET में ViewModel सत्यापन के लिए DataAnnotations उपयोग कर सकते हैं।

वही डीटीओ में अलग-अलग व्यूमोडल्स मैपिंग हो सकती है, और वन व्यू मॉडेल को अलग-अलग डीटीओ (हमेशा ऑब्जेक्ट मैपिंग संरचना के साथ) से बनाया जा सकता है। क्योंकि मुझे लगता है कि यदि आपके पास एक व्यूमोडेल है जिसमें डीटीओ है, तो हमें भी वही समस्या होगी।

अपनी प्रस्तुति परत से, डीटीओ को अनुबंध के रूप में सोचें, आपको उस ऑब्जेक्ट को प्राप्त होगा जिसे आपको अपने आवेदन के लिए अजनबी के रूप में विचार करना है और उस पर कोई नियंत्रण नहीं है (भले ही आपके पास सेवा हो, डीटीओ और प्रेजेंटेशन परतें आपकी हैं)।

अंत में अगर आप इस साफ जुदाई करते हैं, developpers आसानी से एक साथ काम कर सकते हैं। व्यक्ति जो डिजाइन ViewModels, दृश्य और नियंत्रकों सेवा परत या डीटीओ कार्यान्वयन के बारे में चिंता करने के लिए जब दूसरों developpers उनके क्रियान्वयन खत्म क्योंकि वह मानचित्रण कर देगा नहीं है ... यहाँ तक कि उसने मजाक उपकरण या मैनुअल मजाक उपयोग कर सकते हैं परीक्षण के लिए डेटा के साथ प्रस्तुति परत भरने के लिए।

+0

मैंने अभी वीएस 2012 स्थापित किया है और वहां एमवीसी 4 सिंगल पेज एप्लीकेशन देखा है। नमूना प्रोजेक्ट में, वेब एपीआई में नियंत्रक विधियों (या क्रियाओं) के लिए पैरामीटर के रूप में डीटीओ का उपयोग किया जाता है।दूसरे शब्दों में, जेएसओएन उन तरीकों पर पोस्ट किया गया है और कुछ एमवीसी जादू के साथ, विधियों को पारित करने से पहले डेटा स्वचालित रूप से डीटीओ में परिवर्तित हो जाता है। क्या आपको लगता है कि इस मामले में डीटीओ का उपयोग करना गलत है। क्या देखना चाहिए मॉडल को वेब एपीआई के साथ इस्तेमाल किया जाना चाहिए? मैं बेहतर समझने के लिए कह रहा हूं, क्योंकि मैं अभी भी इन अवधारणाओं से परिचित नहीं हूं। –

+0

सलात जीन-फ्रैंकोइस बेउचैम्प :) एएसपी.नेट एमवीसी किसी ऑब्जेक्ट में यूआरएल प्राम्स को पार कर सकता है, उदाहरण के लिए: मान लीजिए कि मेरे पास इंडेक्स विधि AJAX/index/{jobID}/{resultsToSkip}/{resultsToSend} "के लिए यह मैपिंग है। नियंत्रण सूचकांक (int jobID, int resultsToSkip, int resultsToSend) में होने के बजाय मेरे पास इंडेक्स (अनुरोध) होगा (अनुरोध एक ऑब्जेक्ट है जो 3 फ़ील्ड्स जॉबआईडी को समाहित करता है ...) तो अब आप जिन पैराम्स से बात कर रहे हैं डेटा के साथ आपके एपिकेशन जो डेटा को समाहित करते हैं, इसलिए हाँ हम अनुरोध डीटीओ कह सकते हैं। उदाहरण के लिए आपको एक अन्य फ़ील्ड जोड़ना होगा जो आप केवल डीटीओ बदलते हैं, एपीआई इंटरफ़ेस विधियों को नहीं। –

0

यदि आप डीटीओ को व्यूमोडेल के रूप में उपयोग करेंगे, तो इसका मतलब है कि आप डीटीओ पर उच्च निर्भरता बना रहे हैं क्योंकि किसी कारण से आप डीटीओ बदल रहे हैं तो यह व्यूमोडेल पर प्रभाव डाल सकता है।

बेहतर उपयोग डीटीओ & viewmodel में तब्दील।

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