मुझे एमवीसी में एपीआई अनुरोध कहां रखना चाहिए?


25

मैं MVC पैटर्न का उपयोग करके एक वेब एप्लिकेशन बना रहा हूं। इस तरह की वास्तुकला के बाद हम देख सकते हैं कि डेटाबेस के साथ बातचीत करने के लिए उपयोग किए जाने वाले सभी तरीकों को मॉडल में लागू किया गया है

लेकिन क्या होगा अगर मुझे वेब पर दूसरों द्वारा उजागर की गई सेवा को कॉल करना होगा? उदाहरण के लिए, मैं अपने पृष्ठ के सभी अनुयायियों को प्राप्त करने के लिए फेसबुक एपीआई का उपयोग करना चाहूंगा, इसलिए, मैंने इन विधियों को कहां रखा है?

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

तो, क्या आप मुझे इसके बारे में कुछ संकेत दे सकते हैं? और कृपया, क्या आप मुझे बता सकते हैं कि क्या मैं एमवीसी वास्तुकला के बारे में कुछ गलतियां कर रहा हूं?


2
मुझे लगता है कि यदि आप अपने MVC आवेदन का समर्थन करने के लिए उपयोग कर रहे हैं तो कुछ पुस्तकालयों और रूपरेखाओं को सूचीबद्ध करने में लोग बेहतर उत्तर दे पाएंगे। जबकि एमवीसी पैटर्न प्रौद्योगिकी अज्ञेयवादी है, सभी ढांचे स्पष्ट रूप से इसका पालन नहीं करते हैं। इसके अलावा, अधिकांश परिपक्व रूपरेखाओं में पहले से ही बकाया दस्तावेज हैं और यह जानते हुए कि आप जो उपयोग कर रहे हैं वह आपको एक पूर्व-मौजूदा स्पष्टीकरण पर निर्देशित करना आसान बना देगा जो आपकी सोच की रेखा का अनुसरण करता है।
CLW

2
डेटाबेस? डेटा स्रोत? इसका सिर्फ डेटा है।

2
"एमवीसी" क्या माना जाता है, के इतने सारे मत हैं, कि यह सवाल जवाब देने के लिए बहुत सार है।
रेमकोगर्लिच

2
इसके अलावा, अपने फ्रंटएंड जावास्क्रिप्ट कोड से एपीआई को कॉल करने पर विचार करें, और इसे अपने बैकएंड "एमवीसी" सामान को छूने न दें।
रेमकोगर्लिच

@Remcogerlich यही कारण है कि मैंने वास्तविक कार्यान्वयन का एक प्रस्ताव रखा, जिसे वह देख रहा है। वह बैकएंड और एमवीसी के फ्रंटएंड कार्यान्वयन के साथ काम कर सकता है। हमारे पास एक और पैटर्न हो सकता है जो इन अंतरों को बेहतर ढंग से समझाए।
CLW

जवाबों:


37

मॉडल डेटाबेस के साथ बातचीत तक सीमित नहीं है, डेटा प्राप्त करने और हेरफेर करने के लिए मॉडल जिम्मेदार है।

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

एमवीसी एक प्रस्तुति पैटर्न है, जो केवल विभिन्न प्रतिनिधित्व परतों को अलग करता है।

इसका मतलब यह नहीं है, कि मॉडल को स्पेगेटी कोड का एक समान गड़बड़ होना है। आपका मॉडल खुद भी स्तरित हो सकता है, लेकिन नियंत्रक को यह नहीं पता होना चाहिए कि डेटा कहां से आता है।

आपके मॉडल में एक सार्वजनिक विधि को इस तरह संरचित किया जा सकता है (छद्म-कोड), जिसे आपके नियंत्रक द्वारा कहा जा सकता है:

public MyDataClass getData(int id) {
    WebServiceData wsData = WebService->getData(id);
    DatabaseData dbData = ORM->getData(id);
    return new MyDataClass(wsData, dbData);
}

WebServiceऔर ORMऐसे इंटरफेस होने की आवश्यकता हो सकती है जो निर्भरता इंजेक्शन के माध्यम से मॉक द्वारा प्रतिस्थापित किए जा सकते हैं, लेकिन आपके नियंत्रकों और विचारों को परीक्षण उद्देश्यों के लिए बदलना नहीं है।


8
मॉडल में कोई तर्क नहीं होना चाहिए और इस तरह सीधे किसी भी चीज़ के साथ बातचीत नहीं करनी चाहिए। MVC पैटर्न स्पष्ट रूप से सभी तर्कों को नियंत्रकों में रखने के लिए कहता है। इन नियंत्रकों को डीबी, एपीआई, आदि से संपर्क करना चाहिए ... और आवश्यक रूप से मॉडल को अपडेट करना चाहिए। यह आपके मॉडल प्रौद्योगिकी को अज्ञेय रखता है, और यह सुनिश्चित करता है कि यह भंडारण तंत्र से अधिक कुछ भी नहीं है जो कि अतिरिक्त हेरफेर के लिए प्रस्तुति और नियंत्रकों के लिए विभिन्न विचारों को पारित किया जा सकता है।
CLW

3
@CLW: मॉडल! = डेटा मॉडल। अधिक विवरण कहीं और पाया जा सकता है, उदाहरण के लिए stackoverflow.com/a/14045514/124983
रेसिडम

2
@CLW: व्यावसायिक तर्क एम, वी, या सी में नहीं होना चाहिए । मॉडल एक डेटा स्टोर का एक अमूर्त है, दृश्य और नियंत्रक आपके उपयोगकर्ता इंटरफ़ेस हैं। वे आपके द्वारा बनाए जा रहे वास्तविक एप्लिकेशन की परिधि हैं, जो "बस कोड" होना चाहिए, जिसे डेटाबेस और वेब जैसी चीजों के बारे में पता नहीं होना चाहिए।
रेमकोगर्लिच

2
"मॉडल" भाग की व्याख्या कई सौ अलग-अलग तरीकों से की जाती है। मुझे हमेशा सिखाया जाता था कि एक मॉडल एक प्रतिनिधित्व है। एक मॉडल ट्रेन एक वास्तविक ट्रेन का प्रतिनिधित्व करती है, जिसमें कुछ चलते हुए हिस्से होते हैं जो वास्तविक की तरह चलती हैं। इसी तरह, आपके ऐप का मॉडल उन प्रणालियों और प्रक्रियाओं का प्रतिनिधित्व करता है जिन्हें आप बदलने के लिए अपने सॉफ़्टवेयर का निर्माण कर रहे हैं। जैसे, मॉडल्स का व्यवहार होता है । वह व्यवहार आपके "व्यावसायिक तर्क" को शामिल करता है। इस प्रकार, जब आप शुद्ध CRUD डेटा एक्सेस, UI, और इंटरॉप को अनदेखा करते हैं, तो जो बचा है वह संभवतः आपका "मॉडल" है - डोमेन कक्षाएं, व्यावसायिक नियम, आदि
anaximander

1
@RemcoGerlich मैंने व्यावसायिक तर्क के बारे में कुछ नहीं कहा। मैंने केवल यह कहा है कि चूंकि मॉडल के लिए एमवीसी की अधिकांश व्याख्याएं आपके एप्लिकेशन स्टेट का प्रतिनिधित्व करने वाली एक साधारण संरचना से अधिक कुछ नहीं हैं, इसलिए कि डीबी, एपीआई, आदि से संपर्क करने की जिम्मेदारी ... मॉडल के भीतर नहीं रखी जानी चाहिए क्योंकि यह होनी चाहिए तर्क मुक्त। डेटाबेस के साथ संचार करने का कर्तव्य या तो नियंत्रक पर गिरना चाहिए या नियंत्रक द्वारा प्रबंधित किसी अन्य वस्तु पर।
CLW

12

वहाँ एक आम (जानबूझकर?) गलतफहमी है कि एम, वी और सी क्या हैं। उन भूमिकाओं के बारे में नहीं जो वे लेते हैं, लेकिन वे क्या हैं

MVC के मूल, डेस्कटॉप GUI परिभाषा में, वे मॉड्यूल थे । आमतौर पर एक एप्लिकेशन में उनमें से कई थे, कभी-कभी ट्रिपलेट्स में काम करते थे, कभी-कभी कई तरह के विचार और मॉडल होते थे जो कुछ नियंत्रक मिश्रण और मेल कर सकते थे।

वेब फ्रेमवर्क, ओटीओएच में, वे परतों के रूप में दिखाई देते हैं , जहां वे प्रत्येक में से एक हैं और ज्यादातर कुछ उप-संयम स्तर को कवर करने पर व्यवहार करते हैं: "मॉडल परत डेटाबेस को सार करता है", "दृश्य परत कार्यान्वयन प्रस्तुति," नियंत्रक परत प्रक्रिया उपयोगकर्ता इनपुट "।

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


1
सहमत: मॉडल (ओं) को हमेशा संपूर्ण समस्या डोमेन माना जाता था। जटिल ऐप्स में यह हमेशा कोड का थोक होना चाहिए था। उनमें वे सभी कोड शामिल थे जो यदि आप उपयोगकर्ता इंटरफ़ेस (जैसे कि वेब साइट से GUI या यहां तक ​​कि कमांड लाइन एप्लिकेशन) को बदलते हैं, तो नहीं बदलेगा। एक कंपाइलर के बारे में सोचो। यदि आप कमांड लाइन UI से GUI, या यहां तक ​​कि वेब UI पर जाते हैं, तो केवल कोड का एक बहुत छोटा हिस्सा बदल जाएगा। इस तरह के एक आवेदन के सभी मॉडल हैं।
केविन कैथार्ट

1
शब्द के मूल स्मॉलटाक उपयोग में, इंटरफ़ेस में प्रत्येक यूआई नियंत्रण का अपना मॉडल, दृश्य और नियंत्रक था।
रेमकोगर्लिच

5

एमवीसी की किसी भी चर्चा के साथ कठिनाई का हिस्सा यह है कि विभिन्न समूहों ने अलग-अलग चीजों का मतलब निकालने के लिए इसे चुना है। एक रेलिंग ऐप में इस्तेमाल होने वाले एमवीसी का कार्यान्वयन, स्विंग ऐप लिखने वाले किसी व्यक्ति के लिए लगभग अपरिचित होगा। इस हद तक कि MVC अभी भी एक अच्छी तरह से परिभाषित चीज है, यह मार्गदर्शक सिद्धांतों के एक सेट से अधिक है (अपने दृश्य प्रतिनिधित्व से कोर एप्लिकेशन को अलग करें, दोनों को एक साथ जोड़ने की अनुमति देने के लिए लचीला तंत्र प्रदान करें), जिसे विभिन्न में लागू किया जा सकता है तरीके।

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

इसलिए, यह जानना कठिन है कि आप "MVC" के किस संस्करण के साथ काम कर रहे हैं। हालांकि, एक एपीआई अनुरोध आम तौर पर कोर एप्लिकेशन का हिस्सा होगा (वह हिस्सा जो आपको एक अलग दृश्य प्रतिनिधित्व का उपयोग करने का निर्णय लेने पर बदलना नहीं चाहिए), जो कि कई कार्यान्वयन में पूरी तरह से मॉडल के भीतर निहित होगा।


2

यहाँ , मॉडल को इस तरह वर्णित किया गया है:

एक मॉडल डेटा संग्रहीत करता है जिसे नियंत्रक को पुनः प्राप्त किया जाता है और दृश्य में प्रदर्शित किया जाता है। जब भी डेटा में कोई परिवर्तन होता है तो इसे कंट्रोलर द्वारा अपडेट किया जाता है।

मैं कहूंगा कि नियंत्रक में सेवा को कॉल करने का तर्क शामिल है या एक अलग Serviceऑब्जेक्ट को कॉल करता है। यदि सेवा अलग है, तो आप अधिक आसानी से परीक्षण बना सकते हैं, कह सकते हैं, यदि नेटवर्क पर सेवा से कोई संबंध संभव नहीं है, तो कुछ स्थानीय स्तर पर TestServiceप्रतिक्रिया दे सकते हैं Service

इस उत्तर को भी देखें जो बताता है कि नियंत्रक सेवा को कॉल करता है।


2

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

आपका नियंत्रक किसी भी एपीआई, डेटाबेस, सेवाओं, आदि से संपर्क करने के लिए जिम्मेदार होना चाहिए ... परिवर्तन का अनुरोध करना और मॉडल के लिए किसी भी आवश्यक अपडेट का प्रबंधन करना।

MVC पैटर्न की पूरी ताकत यह है कि यह व्यू और स्टेट (मॉडल) से लॉजिक (कंट्रोलर) को डिकॉय करता है। ऐसा करने में अब आपको गारंटी दी जाती है कि कंट्रोलर में केवल कोड ही साइड इफेक्ट बना सकता है क्योंकि व्यू और मॉडल को केवल बदलाव करने की अनुमति नहीं है।

यह कोड के बेहतर पुन: उपयोग के लिए भी अनुमति देता है क्योंकि एक मॉडल को विभिन्न नियंत्रकों और विचारों के बीच साझा किया जा सकता है।


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

@anaximander नहीं मैं एमवीसी की एक सख्त सख्त व्याख्या में मॉडल का उल्लेख कर रहा हूं (देखें विकिपीडिया, माइक्रोसॉफ्ट एमवीसी, हेड फर्स्ट डिज़ाइन पैटर्न, आदि ...) उन उदाहरणों में मॉडल डेटा पास करने के लिए एक साधारण संरचना से अधिक कुछ नहीं है चारों ओर और एक दृश्यदर्शी जैसी कोई चीज नहीं है। जबकि Microsoft MVC कार्यान्वयन मॉडल में विभिन्न विशेषताओं को जोड़ता है, यह किसी भी चीज़ की तुलना में सुविधा के लिए अधिक है। अंत में एमवीसी पैटर्न का उद्देश्य कोड पृथक्करण के अच्छे अभ्यास और साइड इफेक्ट्स को सीमित करना था।
CLW

1

यहां से रास्ता बंद हो सकता है, लेकिन यह है कि मैं WebApps के बारे में कैसा महसूस करता हूं और [जटिल] दूरस्थ एपीआई के साथ कई मामलों में काम कर रहा हूं:

मैं इसे मॉडल के बजाय एक वर्ग (यानी, डेटा शमन विधियों का एक पुस्तकालय) बनाऊंगा (यानी, डेटा शमन कार्यों का ढेर)। ऐसा लगता है कि यह अधिक पारदर्शी, अधिक तर्क / स्कीमा अज्ञेय कार्य करेगा, और आप इसे लोड किए बिना जहां भी इसका उपयोग कर सकते हैं-> किसी मॉडल / नियंत्रक को स्वयं कॉल करें जब भी आप इसका उपयोग करना चाहते हैं। तर्क को अभी भी अलग किया गया है, डेटापॉइंट अभी भी लचीला है, और यह क्लाइंटअजैक्स-> appJSON-> appLIB-> RemoteAPI-> रिमोटजन्स आदि जैसे अजीब मामलों में अंतर के लिए अधिक खुला लगता है।

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