मज़ा हिस्सा: इस MVC
में viewmodels
तक सीमित नहीं है, यह वास्तव में "अच्छे पुराने डेटा/व्यापार/ui परतों" चिंताओं में से अर्थात जुदाई की जुदाई की बात है। मैं इसे बाद में समझाऊंगा, लेकिन अभी के लिए; ध्यान रखें कि यह MVVM
या किसी अन्य डिज़ाइन पैटर्न पर भी लागू होता है।
क्या यह डोमेन मॉडल के उदाहरणों को देखने के लिए व्यूमोडेल के लिए स्वीकार्य है?
असल में नहीं, हालांकि मुझे लगता है कि यह बहुत कुछ होता है। यह आपकी परियोजना के quick-win
स्तर पर थोड़ा सा निर्भर करता है।
मुझे एक उदाहरण दें। निम्न दृश्य मॉडल की कल्पना कीजिए:
public class FooViewModel
{
public string Name {get; set;}
public DomainClass Genre {get;set;}
}
और निम्नलिखित DomainClass
//also applies to database data/POCO classes
public class DomainClass
{
public int Id {get; set;}
public string Name {get;set;}
}
तो, अपने नियंत्रक में कहीं आप FooViewModel पॉप्युलेट करने और अपने दृश्य के लिए उस पर गुजरती हैं।
1) डोमेन मॉडल परिवर्तन:
अब, निम्न परिदृश्यों पर विचार करें।
इस मामले में आपको शायद दृश्य को समायोजित करने की आवश्यकता होगी, यह चिंताओं को अलग करने के संदर्भ में खराब अभ्यास है।
यदि आपने DomainModel से ViewModel को अलग किया है, तो मैपिंग में एक मामूली समायोजन (ViewModel => DomainModel (और back)) पर्याप्त होगा।
2) डोमेन क्लास ने गुणों को घोंसला दिया है और आपका दृश्य केवल GenreName
प्रदर्शित करता है।
मैंने वास्तविक वास्तविक परिदृश्यों में यह गलत देखा है।
इस मामले में एक आम समस्या यह है कि @Html.EdittorFor
का उपयोग नेस्टेड ऑब्जेक्ट के लिए इनपुट का कारण बन जाएगा। इसमें Id
एस और अन्य संवेदनशील जानकारी शामिल हो सकती है। इस कोर्स के बाद, आप खुद को hidden
इनपुट बनायेंगे। यदि आप इसे सर्वर साइड मॉडलबाइंडिंग या ऑटोमैपर के साथ जोड़ते हैं तो यह छिपी हुई Id
के फायरबग जैसे उपकरणों के हेरफेर को अवरुद्ध करना वाकई मुश्किल है।
यद्यपि यह संभव है, संभवतः, उन क्षेत्रों में से कुछ को अवरुद्ध करने के लिए, अधिक घोंसला वाले डोमेन/डेटा ऑब्जेक्ट्स को अवरोधित करने के लिए, यह भाग सुरक्षित करने के लिए और अधिक कठिन हो जाएगा।और ध्यान रखें, कि आप अपने डोमेन मॉडल को उस कारण से बदलना चाहेंगे जो दृश्य को लक्षित नहीं कर रहा है। इसलिए आपके डोमेन मॉडल में प्रत्येक बदलाव के साथ आपको अवगत होना चाहिए कि नियंत्रक के दृश्य और सुरक्षा पहलुओं को प्रभावित कर सकता है।
3) एएसपीनेट-एमवीसी में सत्यापन गुणों का उपयोग करना आम है।
क्या आप वास्तव में अपने डोमेन को अपने विचारों के बारे में मेटाडेटा रखना चाहते हैं? या अपने डेटा-लेयर पर व्यू-लॉजिक लागू करें? क्या आपका व्यू-सत्यापन हमेशा डोमेन-सत्यापन के समान ही है? क्या यह वही सत्यापन तर्क है? क्या आप अपने डोमेन-मॉडल क्रॉस एप्लिकेशन का उपयोग कर रहे हैं? आदि
मुझे लगता है कि यह स्पष्ट है कि यह लेने का मार्ग नहीं है।
4) अधिक
मैं आप दे सकते हैं और अधिक परिदृश्य के, लेकिन यह क्या और अधिक आकर्षक है करने के लिए स्वाद का मामला है। मैं सिर्फ इस बिंदु पर आशा करता हूँ आप बिंदु मिल जाएगा :) फिर भी, मैं एक उदाहरण देने का वादा किया:
अब, वास्तव में गंदा के लिए और quick-wins
यह काम करेंगे, लेकिन मैं आपको लगता है नहीं है इसे चाहिए
यह दृश्य-मॉडल बनाने के लिए थोड़ा और प्रयास है, जो आम तौर पर डोमेन मॉडल के समान 80 +% के लिए होता है। यह अनावश्यक मैपिंग कर की तरह महसूस कर सकते हैं, लेकिन जब पहले वैचारिक अंतर पैदा होती है, तो आप पाएंगे कि यह प्रयास :)
एक विकल्प के रूप
तो लायक था, मैं एक सामान्य मामले के लिए निम्नलिखित सेटअप का प्रस्ताव:
- एक viewmodel
- एक domainmodel
- एक डेटामॉडल
- बनाने बनाने बनाने
automapper
की तरह एक पुस्तकालय का उपयोग दूसरे के (से मानचित्रण बनाने के लिए इसको Foo.FooProp
मैप करने के लिए मदद मिलेगी)
लाभ हैं, उदाहरण के लिए; यदि आप अपनी डेटाबेस टेबल में से एक में एक अतिरिक्त फ़ील्ड बनाते हैं, तो यह आपके दृश्य को प्रभावित नहीं करेगा। यह आपकी व्यावसायिक परत या मैपिंग को हिट कर सकता है, लेकिन वहां रुक जाएगा। बेशक, अधिकांश समय आप अपना विचार भी बदलना चाहते हैं, लेकिन इस मामले में आप को की आवश्यकता नहीं है। इसलिए यह आपके कोड के एक हिस्से में समस्या को अलग रखता है।
वेब एपीआई/डेटा परत
फिर भी यह कैसे एक वेब एपीआई/एफई परिदृश्य में काम करेंगे की एक और ठोस उदाहरण:
टिप्पणी
जैसा कि @ mrjoltcola ने कहा: ध्यान में रखने के लिए एक अति-इंजीनियर घटक भी है। यदि उपरोक्त में से कोई भी लागू नहीं होता है, और उपयोगकर्ता/प्रोग्रामर पर भरोसा किया जा सकता है, तो आप जाने के लिए अच्छा लगा। लेकिन ध्यान रखें कि डोमेनमोडेल/व्यूमोडेल मिश्रण के कारण रखरखाव और पुनः उपयोगिता कम हो जाएगी।
आपके पहले दृष्टिकोण में मॉडल ऑब्जेक्ट तक पूर्ण पहुंच देना खतरनाक हो सकता है। बेहतर विकल्प आपके मॉडल को निजी क्षेत्र में रखेगा और केवल उन गुणों का खुलासा करेगा जिन्हें देखने के लिए जरूरी है। जैसे सार्वजनिक स्ट्रिंग शीर्षक {प्राप्त करें {this.album.Title को वापस करें; } सेट करें {this.album.Title = value;}} –