क्या ASP.NET MVC एप्लिकेशन को सीधे मॉडल के रूप में एंटिटी फ्रेमवर्क का उपयोग करना चाहिए?


22

मैं विजुअल स्टूडियो 2013 (एमवीसी 5) में अपना पहला एमवीसी एप्लिकेशन बना रहा हूं और अपने मॉडल को सेटअप करने के सबसे अच्छे तरीके पर मैं थोड़ा अस्पष्ट हूं।

मैंने मौजूदा डेटाबेस से कोड-प्रथम का उपयोग करके एक इकाई ढांचा मॉडल तैयार किया है। मेरी पहली वृत्ति कुछ मध्यस्थ वर्गों का निर्माण करना था जो कि विचारों द्वारा उपयोग किया जाने वाला मॉडल होगा और उन वर्गों को इकाई ढांचे की कक्षाओं के साथ काम करना होगा।

जैसा कि मैं मध्यस्थ वर्गों को लिख रहा था मुझे एहसास हुआ कि मैं ज्यादातर सिर्फ उन चीजों को फिर से लागू कर रहा था जो ईएफ कक्षाएं पहले से ही कभी-कभार निजी सेटर के साथ या एक डेटाटाइप से दूसरे में डाली जाती थीं। तो वह बर्बादी की तरह लग रहा था।

क्या सामान्य नियम एमवीसी एप्लिकेशन के लिए मॉडल के रूप में सीधे इकाई ढांचे की कक्षाओं का उपयोग करने के लिए है? या इन मध्यस्थ वर्गों के निर्माण के लिए मुझे कुछ लाभ हुआ है?


1
यह मदद कर सकता है: programmers.stackexchange.com/questions/123011/…
oasten

यदि आप पहले कोड का उपयोग कर रहे थे, तो कोई मौजूदा डेटाबेस नहीं था, नहीं?
इसहाक क्लेनमैन

1
EF 6.1+ से आप मौजूदा डेटाबेस से एक कोड-पहला मॉडल तैयार कर सकते हैं। इस MSDN लेख को देखें: msdn.microsoft.com/en-au/data/jj200620.aspx
माइक डी।

जवाबों:


23

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

  • Example.Entities - EF और उन्हें तक पहुँचने के लिए DB संदर्भ के लिए मेरी इकाइयाँ हैं।
  • उदाहरण.मॉडल - MVC मॉडल शामिल हैं।
  • उदाहरण । वेब - वेब अनुप्रयोग। उदाहरण.डोमेन और उदाहरण.मॉडल दोनों पर निर्भर करता है।

डोमेन संस्थाओं की तरह अन्य वस्तुओं के संदर्भों को रखने के बजाय, एमवीसी मॉडल आईडी को पूर्णांक के रूप में रखते हैं।

जब किसी पृष्ठ के लिए GET अनुरोध आता है, MVC नियंत्रक डेटाबेस क्वेरी करता है, जो एक इकाई देता है। मैंने "कन्वर्टर" विधियाँ लिखी हैं जो एक डोमेन एंटिटी लेते हैं और इसे MVC मॉडल में बदलते हैं। ऐसे अन्य तरीके हैं जो विपरीत (एमवीसी मॉडल से एक डोमेन इकाई के लिए) करते हैं। मॉडल तब दृश्य में पास हो जाता है, और इस तरह क्लाइंट को।

जब कोई POST अनुरोध आता है, MVC नियंत्रक को MVC मॉडल मिलता है। एक कन्वर्टर विधि इसे एक डोमेन इकाई में परिवर्तित करती है। यह विधि किसी भी मान्यताओं को निष्पादित करती है, जिन्हें विशेषताओं के रूप में व्यक्त नहीं किया जा सकता है, और यह सुनिश्चित करता है कि यदि डोमेन इकाई पहले से मौजूद है कि हम इसे नया पाने के बजाय इसे अपडेट कर रहे हैं। विधियाँ आमतौर पर कुछ इस तरह दिखती हैं:

public class PersonConverter
{
    public MyDatabaseContext _db;

    public PersonEntity Convert(PersonModel source)
    {
         PersonEntity destination = _db.People.Find(source.ID);

         if(destination == null)
             destination = new PersonEntity();

         destination.Name = source.Name;
         destination.Organisation = _db.Organisations.Find(source.OrganisationID);
         //etc

         return destination;
    }

    public PersonModel Convert(PersonEntity source)
    {
         PersonModel destination = new PersonModel()
         {
             Name = source.Name,
             OrganisationID = source.Organisation.ID,
             //etc
         };

         return destination;
    }
}

इन विधियों का उपयोग करके मैं दोहराव को बाहर निकालता हूं जो अन्यथा प्रत्येक नियंत्रक में होता है। जेनेरिक के उपयोग से चीजों को और अधिक खराब किया जा सकता है।

इस तरह से चीजें करने से कई लाभ मिलते हैं:

  • आप किसी विशिष्ट दृश्य या क्रिया के लिए एक मॉडल को अनुकूलित कर सकते हैं। मान लें कि आपके पास किसी ऐसे व्यक्ति के लिए साइनअप फ़ॉर्म है जिसे सबमिट करते समय, कई अलग-अलग संस्थाएँ (व्यक्ति, संगठन, पता) बनाती हैं। एमवीसी मॉडल को अलग किए बिना यह बहुत मुश्किल होगा।
  • अगर मुझे देखने के लिए अधिक जानकारी पास करने की आवश्यकता है, अन्यथा यह केवल इकाई में उपलब्ध होगा, या दो संस्थाओं को एक मॉडल में संयोजित करेगा, तो मेरे कीमती डेटाबेस मॉडल कभी भी स्पर्श नहीं किए जाएंगे।
  • यदि आप कभी JVC या XML के रूप में एक MVC मॉडल को क्रमबद्ध करते हैं, तो आपको केवल तत्काल मॉडल को क्रमबद्ध किया जा सकता है, न कि इस से जुड़ी प्रत्येक अन्य इकाई।

अच्छा उत्तर, एक वर्ग से दूसरे वर्ग के गुणों को मैन्युअल रूप से मैप करने के बजाय ValueInjector या कुछ इसी तरह (व्यक्तिगत रूप से मुझे ऑटोमोटिव से नफरत है) का उपयोग करने की सलाह देगा।
रॉकलैन

1
एक अलग उत्तर जोड़ने के बजाय, मैं यहां सिर्फ टिप्पणी करूंगा कि DDD प्रथाओं में, आपके "कन्वर्टर्स" और दृश्य के लिए अलग मॉडल को एप्लिकेशन सर्विस लेयर का हिस्सा माना जाएगा। असल में, यह आपके डोमेन मॉडल को एप्लिकेशन से उस जटिलता को छिपाने के दौरान आवश्यकतानुसार जटिल होने की अनुमति देता है। यह डोमेन मॉडल में बदलाव के कारण एप्लिकेशन को परिवर्तित होने से भी बचाता है। एएसएल अनुवाद को संभालता है।
माइकल ब्राउन

तो आप उस मॉडल की जानकारी प्राप्त करने के लिए अपने पर्सनॉलडेल (यानी संगठन ऑब्जेक्ट) में प्रत्येक मॉडल के लिए एक कॉल करते हैं? कहते हैं कि आपके पास व्यक्ति और संगठन की जानकारी को अपडेट करने के लिए एक फॉर्म है, क्या आपके पास संगठन को अपडेट करते समय अतिरिक्त कॉल होगा? मैं संग्रहीत procs का उपयोग कर रहा हूँ तो क्या मैं सभी मॉडल की विशेषताओं और किसी भी मॉडल के सभी विशेषताओं को एक साथ नहीं भेज सकता?
चमकदार

1
आप किसी संग्रह को वापस मैप करने का तरीका कैसे संभालेंगे? ऐसा लगता है कि EF6 में बहुत अधिक जटिल हो गया है क्योंकि आप अब अपडेट के साथ संस्थाओं की एक नई सूची नहीं बना सकते हैं क्योंकि यह सब कुछ फिर से बनाता है ...
गेरार्ड विल्किंसन

2
अपने स्वयं के कनवर्टर वर्गों को लिखने के बजाय मैं इस समस्या को हल करने के लिए लिखे गए ऑटोमैपर लाइब्रेरी का उपयोग करने की सलाह दूंगा । यह 2014 के बाद से काफी परिपक्व हो गया है!
बेनस्मिथ

6

मैं कहूंगा कि यह वास्तव में आपके आवेदन पर निर्भर करता है। क्या यह सिर्फ शुद्ध CRUD है, बिना किसी व्यावसायिक तर्क के? तब मैं सीधे अपने विचारों में ईएफ मॉडल का उपयोग करता हूं।

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

हालाँकि, यदि एप्लिकेशन में बहुत सारे व्यावसायिक तर्क हैं और / या बहुत बड़े पैमाने पर करने की आवश्यकता है, तो मैं कम से कम कोर को CQRS (कमांड क्वेरी रिस्पांसिबिलिटी सेग्रीगेशन), DDD (डोमेन ड्रिवेन डिज़ाइन) और संभवतः इवेंट सोर्सिंग का उपयोग करके लागू करूंगा। तब EF को रीड मॉडल के रूप में इस्तेमाल किया जा सकता है।

यह भी याद रखें कि आपको पूरे आवेदन के लिए एक रणनीति / पैटर्न से चिपके रहने की आवश्यकता नहीं है, कुछ क्षेत्र शुद्ध सीआरयूडी हो सकते हैं और अन्य क्षेत्रों में बहुत सारे व्यावसायिक तर्क हो सकते हैं ...

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.