2013-05-03 9 views
44

मैं मैं ViewModels बनाने के लिए और का उपयोग करें कि या पैरामीटर के रूप में उन्हें वापस पारित एक MVC परियोजना में आम तौर पर WebAPI जानने के लिए और अपने आप को सामान है कि एक MVC परियोजना में समझ में आता है कर लगाने के लिए शुरू कर रहा हूँ, लेकिन में कोई मतलब नहीं हो सकता है।क्या यह वेबपी में व्यूमोडल्स रखने के लिए समझ में आता है?

दृश्य के साथ।

चूंकि वेबपी में कोई विचार नहीं है, मुझे लगता है कि व्यूमोडेल को पैरामीटर के रूप में समझना नहीं है।

मुझे आश्चर्य हो रहा है कि अगर मुझे पैरामीटर मेरे ईएफ डोमेन (कोड पहले) के रूप में होना चाहिए और इनमें से शीर्ष पर डेटा एनोटेशन डालना चाहिए। मैं आम तौर पर दृश्य मॉडल गुणों पर एनोटेशन डालता हूं क्योंकि मुझे इसे डोमेन पर पसंद आया।

हालांकि मुझे ऐसा करने से रोकना क्या है, मैं 100% स्पष्ट नहीं हूं कि मेरी एमवीसी साइट कैसे काम करेगी।

क्या एमवीसी साइट सिर्फ सिमुलेशन दृश्यों को थूकती है और फिर आप अपनी वेबपी को कॉल करने के लिए जेक्री का उपयोग करते हैं या आप बस एमवीसी एक्शन विधियों को कॉल करते हैं जो सीधे वेबपी कॉल करने वाले तरीकों को कॉल करते हैं?

यदि दूसरा तरीका है तो मैं फिर से अपने दृश्य मॉडल पर डेटा एनोटेशन डालता हूं लेकिन फिर मैं इसे ईएफ डोमेन और वीएम दोनों पर डाल रहा हूं और यह अनावश्यक प्रतीत होता है।

उत्तर

21

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

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

+0

हां कि कारणों क्यों मैं एफई पर ही मेरी एनोटेशन डाल पसंद नहीं है में से एक है। मुझे लगता है कि मुझे एक दृश्य मॉडल का उपयोग करना चाहिए, लेकिन बस इसे कुछ और डेटामोडेल कहें? मैं अभी भी स्पष्ट नहीं हूं कि पूरी वेबसाइट कैसे काम करेगी। उदाहरण के लिए मेरे पास एक ऐड विधि होगी। मोबाइल डिवाइस और वेबसाइट दोनों जोड़ सकते हैं। क्या एमवीसी साइट वेबपै विधि को भी कॉल करनी चाहिए? इस मामले में यह समझ में आता है। लेकिन मोबाइल में एक एडिट केस के बारे में फिर से वेबपी को कॉल करने के लिए समझ में आता है, लेकिन साइट पर ऐसा लगता है कि आप एमवीसी का उपयोग करने के बजाय बाध्य किए गए दृश्य को वापस पाने के लिए उपयोग करेंगे और फिर उस दृश्य पर वापस पोस्ट करेंगे। – chobo2

+0

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

+0

मुझे लगता है कि आप अपनी एमवीसी साइट के लिए एक अलग परियोजना बनाते हैं और इसे वेबपी के समान समाधान में रखते हैं। मुझे पता है कि वेबपी में एमवीसी नियंत्रक हो सकते हैं लेकिन मुझे लगता है कि दस्तावेज प्रदर्शित करने और उपयोगकर्ता के लिए आपके जैसे एपीआई के लिए यह और अधिक है। – chobo2

6

यदि आप एक आरईएसटी आधारित प्रणाली बनाने की कोशिश कर रहे हैं तो व्यूमोडेल और व्यू की धारणा बहुत उपयोगी हो सकती है। आप ViewModel को संसाधन की धारणा और देखने के लिए प्रतिनिधित्व की काफी बारीकी से नक्शा कर सकते हैं।

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

दृश्य कुछ मीडिया प्रकार का उपयोग करके दृश्य मॉडल सामग्री का एक ठोस अहसास है जिसे तार पर स्थानांतरित किया जा सकता है। वह मीडिया प्रकार क्या है, इस बात पर निर्भर करता है कि आप किस ग्राहक को संतुष्ट करने की कोशिश कर रहे हैं।

+0

तो उत्तर हाँ है? –

3

हम वर्तमान में इसी तरह की परियोजना पर काम कर रहे हैं जो एएसपी.NET एमवीसी और एएसपी.Net वेब एपीआई का उपयोग करता है।

हम अपने पृष्ठों की वैश्विक संरचना उत्पन्न करने के लिए एएसपी.NET एमवीसी का उपयोग करते हैं। फिर, हमारे एमवीवीएम जावास्क्रिप्ट कार्यान्वयन क्लाइंट व्यू मॉडलों में लौटाए गए डेटा को भरने के लिए वेब एपीआई को कॉल करता है। ऐसा करने के लिए, हमारे एपीआई मॉडल को रिटर्न देता है जो फ्रंट एंड के लिए इंतजार कर रहा है।

मुझे लगता है कि आपके एपीआई व्यू मॉडल एमवीसी व्यू मॉडल्स से भिन्न होंगे (जो एमवीवीएम पॉइंट व्यू से व्यूमोडल्स नहीं हैं)।

यह आपके एपीआई के उपयोग पर भी निर्भर करता है। उदाहरण के लिए, आंतरिक उपयोग के लिए, आपको हमेशा अपने डोमेन मॉडल को दिखाने से बचने की आवश्यकता नहीं होती है। तो आप ViewModel में मॉडल को मैप करने और प्रदर्शन बढ़ाने से बचेंगे। लेकिन यदि आपको अपने मॉडल में कुछ गुणों को बदलने की आवश्यकता है, तो देखें मॉडल आपके कोड को ढीले ढंग से युग्मित तरीके से बनाने में आपकी सहायता करेंगे।

चूंकि वेबपी में कोई विचार नहीं है, मुझे लगता है कि व्यूमोडेल को पैरामीटर के रूप में समझना नहीं है।

मैं कहूंगा कि आपका एपीआई अंत में आपके विचारों से भस्म हो जाता है, यह व्यूमोडेल को समझ में आता है।

आप jQuery का उपयोग अपने WebAPI कॉल करने के लिए या यदि आप बस MVC कार्रवाई तरीकों कि सीधे सिर्फ एक ही तरीके का WebAPI कहेंगे फोन कहते हैं MVC साइट अभी वापस थूक साधारण विचारों करता है और उसके बाद?

यह सिर्फ पसंद का सवाल है। आप जेनरेट किए गए दृश्य (एचटीएमएल) प्राप्त करने के लिए एमवीसी एक्शन को कॉल कर सकते हैं या आप जेएसओएन/एक्सएमएल प्रतिक्रिया प्राप्त करने के लिए वेबएपीआई को कॉल कर सकते हैं जिसे आप अपने विचारों में अपने जावास्क्रिप्ट कोड से जोड़ देंगे।

1

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

20

बहुत अधिक समय लगा के बाद मेरे सुझाव इस 'बातें' के साथ काम:

BindingModels बाध्यकारी डेटा के लिए (MVC या एपीआई)

ViewModels MVC पर विचारों के लिए (आप कुछ MVC हो सकता है आपके एपीआई के अंदर के पेज, इसलिए इसके लिए जगह रखना अच्छा है, यह प्रलेखन, परिचय पृष्ठ, जो कुछ भी हो सकता है। यदि कोई दृश्य नहीं है, तो आपके पास शून्य व्यूमोडल्स हो सकते हैं) इसका एक लाभ यह है कि आप अपने विचारों में कर सकते हैं /web.config में ViewModels नामस्थान संदर्भ है और यह आपके एपीआई संसाधनों के साथ प्रदूषित नहीं होगा।

वेब एपीआई संसाधनों के लिए संसाधन मॉडल। वेबपी में, नेस्टेड संसाधन भी ऐसे संसाधन होते हैं जो पेड़ में कहीं भी जाते हैं जो एमवीसी पर आम नहीं है, इसलिए उन्हें संसाधनों का नामकरण बहुत समझ में आता है।

यदि आप संसाधन प्राप्त करना चाहते हैं, तो आप अपने संसाधन मॉडल का उपयोग कर सकते हैं। याद रखें कि आप वही प्राप्त कर रहे हैं जो आप वापस भेज रहे हैं।

यदि आप इनपुट के लिए कस्टम बाइंडिंग चाहते हैं (यह आपका डिफ़ॉल्ट परिदृश्य होना चाहिए) तो आपके बाध्यकारी मॉडल हैं।

यदि आपके पास कोई भी एमवीसी दृश्य है, तो व्यवस्थापक उद्देश्यों, दस्तावेज़ीकरण, जो भी हो, अपने व्यूमोडल्स का उपयोग करें।

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

कभी-कभी, आप संसाधन और कुछ अतिरिक्त फ़ील्ड के साथ बाध्यकारी मॉडल बनाना चाहते हैं। विरासत आपका मित्र है।

कभी-कभी आप एक से अधिक संसाधनों के साथ बाध्यकारी मॉडल बनाना चाहते हैं और (वैकल्पिक रूप से, अतिरिक्त फ़ील्ड) संसाधनों के रूप में संसाधन आपके मित्र हैं।

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

यदि आपको किसी भी आइटम (जैसे फ़ोल्डर संरचना, नामस्थान, आदि) पर और टिप्पणियों की आवश्यकता है, तो बस मुझे बताएं। मैं अपने विपक्ष के पेशेवर अनुभव साझा करने के लिए खुश हूं।

ओह, और मैं भूल गया, एक मानचित्रण रणनीति अनुसंधान के लायक है। मैं व्यक्तिगत रूप से अपनी खुद की मैपिंग करता हूं, लेकिन यह तर्क एक स्थान पर अनमोल है।

संपादित करें: बहुत भोली उदाहरण

ContactViewModel{ 

    string Name {get;} 
    string LastName {get;} 
    List<Country> AvailableCountries {get;} 
    Country Country {get;} 
    bool IsAdmin {get;} 

} 

ContactBindingModel{ 

    string Name {get;set;} 
    string LastName {get;set;} 
    int Country {get;set;} 

} 

ContactResourceModel{ 

    string Name { get;set;} 
    string LastName {get;set;} 
    Country Country {get;set;} 
    string IsAdmin {get;} 

} 
+0

मुझे इस पर आपका दृष्टिकोण पसंद है।आप अपनी कक्षा फाइलों के लिए किस प्रकार के नामकरण सम्मेलन और संरचना का उपयोग कर रहे हैं? "MyModelNameViewModel" के लिए एमवीसी में क्लासिक व्यू मॉडल का नाम देना आम बात है। क्या आप एक ही प्रिंसिपल का उपयोग कर रहे हैं लेकिन बाध्यकारी मॉडल और संसाधन मॉडल के लिए भी? और/या आप विभिन्न मॉडल प्रकारों के लिए अलग फ़ोल्डरों का उपयोग करते हैं? – jimutt

+0

मैं कुछ ऐसा करता हूं। मेरे पास दृश्यों पर वापस जाने के लिए व्यूमोडल्स हैं, और फॉर्ममोडल्स के खिलाफ मेरे अनुरोधों को बाध्य करते हैं, क्योंकि ज्यादातर बार मैं वेबपृष्ठ (एमवीसी) से किसी फ़ॉर्म के खिलाफ बाध्यकारी हूं, हालांकि मैं उन्हें वेबपैली जैसी चीजों के लिए बाध्यकारी मॉडल को भी देख सकता हूं और उन्हें अधिक सार्वभौमिक नामित। मेरा नामकरण सम्मेलन आम तौर पर '[नियंत्रक] [एक्शन] व्यूमोडेल' जैसा कुछ है। तो मैं कुछ लोगों के साथ समाप्त हो सकता हूं जैसे 'PeopleEditFormModel' –

+1

@jimutt हाल ही में मैं नियंत्रक/मॉडल/विचारों के बजाय फीचर फ़ोल्डर संरचना में बहुत कुछ निवेश और शोध कर रहा था। आदि। इससे पहले कि मैं संसाधनों के लिए '[मॉडल] संसाधन 'का उपयोग कर रहा था, दृश्यमान के लिए' [नियंत्रक] [एक्शन] व्यूमोडेल 'और बाध्यकारी मॉडल के लिए' [कमांड] बाध्यकारी मॉडल ', (जहां आदेश इच्छित कार्रवाई है, जैसे CancelOrder, CreateModel, आदि) आमतौर पर कमांड = एक्शननाम। –

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

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