हमारे एमवीसी एप्लिकेशन के बारे में आज मेरी चर्चा गर्म रही। हमारे पास MVC ( ASP.NET ) में लिखी गई वेबसाइट है , और यह आमतौर पर दृश्य में कुछ करने के पैटर्न का अनुसरण करता है -> नियंत्रक से टकराता है -> नियंत्रक एक मॉडल बनाता है (एक प्रबंधक को जो डेटा मिलता है, मॉडल का निर्माण करता है) नियंत्रक विधि ही) -> मॉडल देखने जाता है -> कुल्ला और दोहराएं।
उन्होंने कहा कि हमारा कोड बहुत अधिक युग्मित था। उदाहरण के लिए, यदि हम एक डेस्कटॉप एप्लिकेशन भी चाहते हैं, तो हम अपने मौजूदा कोड का उपयोग नहीं कर पाएंगे।
उनके द्वारा कहा गया समाधान और सबसे अच्छा अभ्यास एक एपीआई का निर्माण करना है, और फिर अपनी वेबसाइट को अपने एपीआई के ऊपर बनाना है, और फिर एक डेस्कटॉप एप्लिकेशन, मोबाइल ऐप आदि का निर्माण करना बहुत सरल है।
यह विभिन्न कारणों से मेरे लिए एक बुरा विचार है।
वैसे भी मैं इस अभ्यास पर चर्चा कर सकते हैं googling द्वारा कुछ भी नहीं मिल रहा है। क्या किसी के पास पेशेवरों, विपक्षों के बारे में कोई जानकारी है, आपको क्यों, आपको क्यों नहीं पढ़ना चाहिए या आगे पढ़ना चाहिए?
मुझे लगता है कि यह एक बुरा विचार है:
यह एक एपीआई से अपने बैकएंड को चलाने के लिए बहुत सार है। आप इसे बहुत लचीला बनाने की कोशिश कर रहे हैं जो इसे एक असहनीय गड़बड़ कर देगा।
MVC में निर्मित सभी चीजें बेकार लगती हैं, जैसे भूमिकाएं और प्रमाणीकरण। उदाहरण के लिए, [अधिकृत] विशेषताएँ और सुरक्षा; आपको अपना रोल खुद करना होगा।
आपके सभी एपीआई कॉल के लिए सुरक्षा संबंधी जानकारी संलग्न करनी होगी, और आपको एक टोकन सिस्टम और व्हाट्सएप विकसित करना होगा।
आपको हर एक फंक्शन के लिए पूरा एपीआई कॉल लिखना होगा जो आपका प्रोग्राम कभी भी करेगा। बहुत ज्यादा हर विधि जिसे आप लागू करना चाहते हैं, उसे एक एपीआई से भागना होगा। प्रत्येक उपयोगकर्ता के लिए एक गेट / अपडेट / डिलीट, प्लस एक दूसरे ऑपरेशन के लिए एक संस्करण जैसे उपयोगकर्ता नाम अपडेट करें, उपयोगकर्ता को एक समूह में जोड़ें, आदि आदि और प्रत्येक एक अलग एपीआई कॉल होगा।
जब API की बात आती है तो आप इंटरफेस और अमूर्त वर्गों जैसे सभी प्रकार के उपकरण खो देते हैं। WCF जैसे स्टफ को इंटरफेस के लिए बहुत ही कठिन समर्थन है।
आपके पास एक विधि है जो एक उपयोगकर्ता बनाती है, या कुछ कार्य करती है। यदि आप 50 उपयोगकर्ता बनाना चाहते हैं, तो आप इसे केवल 50 बार कॉल कर सकते हैं। जब आप इस विधि को एक एपीआई के रूप में करने का निर्णय लेते हैं तो आपका स्थानीय वेबसर्वर नाम-पाइप इसे कनेक्ट कर सकता है और कोई समस्या नहीं - आपका डेस्कटॉप क्लाइंट इसे भी हिट कर सकता है, लेकिन अचानक आपके थोक उपयोगकर्ता निर्माण में इंटरनेट पर एपीआई को 50 बार हथौड़ा करना शामिल होगा जो isn 'अच्छा है। इसलिए आपको एक बल्क विधि बनानी होगी, लेकिन वास्तव में आप इसे सिर्फ डेस्कटॉप क्लाइंट के लिए बना रहे हैं। इस तरह, आप अंत में) अपने एपीआई को संशोधित करते हैं, जो इसके साथ एकीकृत होने पर आधारित है, और आप सीधे इसके साथ एकीकृत नहीं कर सकते हैं, बी) एक अतिरिक्त कार्य बनाने के लिए बहुत अधिक काम करते हैं।
YAGNI । जब तक आप विशेष रूप से दो पहचान वाले कामकाजी एप्लिकेशन, एक वेब और एक विंडोज एप्लिकेशन को उदाहरण के लिए लिखने की योजना नहीं बना रहे हैं, यह अतिरिक्त विकास कार्य की एक बड़ी मात्रा है।
जब आप एंड-टू-एंड के माध्यम से कदम नहीं रख सकते हैं तो डिबगिंग बहुत कठिन है।
स्वतंत्र संचालन के बहुत सारे, जिन्हें बहुत आगे और पीछे की आवश्यकता होगी, उदाहरण के लिए कुछ कोड वर्तमान उपयोगकर्ता को मिल सकते हैं, उपयोगकर्ता को व्यवस्थापक भूमिका में है, उस कंपनी को प्राप्त करें जिसे उपयोगकर्ता संबंधित है, अन्य सदस्यों की सूची प्राप्त करें, उन सभी को भेजें एक ईमेल। इसके लिए बहुत सारे API कॉल की आवश्यकता होगी, या आप जिस विशिष्ट कार्य को चाहते हैं, उसके लिए एक bespoke विधि लिखना, जहाँ bespoke पद्धति का एकमात्र लाभ गति होगा फिर भी नकारात्मक पक्ष यह होगा कि यह अनम्य होगा।
शायद कुछ और कारण ये मेरे सिर के ठीक ऊपर हैं।
यह सिर्फ मुझे लगता है जब तक आपको वास्तव में दो समान अनुप्रयोगों की आवश्यकता नहीं है, तब यह वास्तव में इसके लायक नहीं है। मैंने कभी भी ASP.NET एप्लिकेशन को इस तरह से निर्मित नहीं देखा है, आपको दो अलग-अलग एप्लिकेशन (एपीआई और आपका कोड) लिखना होगा और संस्करण को इन दोनों को भी नियंत्रित करना होगा (यदि आपका उपयोगकर्ता पृष्ठ एक नया क्षेत्र प्राप्त करता है, तो आप ' डी को एपीआई और अपने उपभोग कोड को एक साथ अपडेट करना है ताकि कोई बुरा प्रभाव न हो या इसे मजबूत रखने में बहुत सारे अतिरिक्त काम न करें)।
संपादित करें: कुछ बेहतरीन प्रतिक्रियाएं, वास्तव में यह सब क्या है का एक अच्छा विचार प्राप्त करना शुरू कर रही है। तो मेरे सवाल पर विस्तार करने के लिए, आप इस एपीआई संरचना का पालन करने के लिए एक एमवीसी ऐप कैसे तैयार करेंगे?
उदाहरण के लिए, आपके पास एक वेबसाइट है जो एक उपयोगकर्ता के बारे में जानकारी प्रदर्शित करती है। MVC के तहत, आपके पास:
देखें - (CS) HTML पृष्ठ जो एक UserViewModel नियंत्रक - कॉल्स गेटयूज़र () को प्रदर्शित करता है और एक UserViewModel बनाता है जो इसे गेट मैनेजर विधि (आपकी API की तरह) व्यू मैनेजर क्लास में भेजता है।
नियंत्रक GetUser () करता है, लेकिन आप एक डेस्कटॉप ऐप भी चाहते हैं। इसका अर्थ है कि आपके गेटअप को किसी प्रकार के एपीआई के माध्यम से उजागर करना होगा। आप एक टीसीपी कनेक्शन, या तो WCF, या शायद रिमोटिंग चाहते हैं। आप एक मोबाइल ऐप भी चाहते हैं, जो लगातार कनेक्शन के बाद से Restful होगा।
तो क्या आप हर एक के लिए एक एपीआई लिखेंगे, एक WCF वेब सेवा जिसमें एक विधि GetUser () और कोड बस होता है return new UserManager().GetUser()
? और एक mvc 4 वेब एपीआई विधि जो एक ही काम करती है? अपने MVC नियंत्रक विधि में सीधे GetUser को कॉल करना जारी रखें?
या क्या आप उस समाधान को चुनेंगे जो तीनों (वेब एप रीस्ट सर्विस) के लिए काम करेगा और उस पर सब कुछ बनाएगा, इसलिए सभी तीन एप्स एपीआई कॉल (एमवीसी वाले, लोकल मशीन को) करते हैं।
और क्या यह सिर्फ एक सैद्धांतिक सही परिदृश्य है? मैं इस तरह से विकसित करने के लिए बड़े ओवरहेड्स देख सकता हूं, खासकर यदि आपको एक तरह से विकसित करना है जो आपको संचालन को रीस्टार्ट तरीके से करने देगा। मुझे लगता है कि इसमें से कुछ को उत्तर में कवर किया गया है।
संपादित करें 2: अधिक सामान पढ़ने के बाद, मैंने नीचे टिप्पणी की है कि मुझे लगता है कि यह समझा सकता है। सवाल थोड़ा मुश्किल सवाल है जो मुझे लगता है। क्या आपको अपना बैक-एंड लिखना चाहिए क्योंकि एपीआई ने मुझे यह सोचकर भ्रमित किया था कि एक ही वेबसर्विस होना चाहिए जो सामान करने के लिए सब कुछ (mvc ऐप, डेस्कटॉप ऐप, मोबाइल ऐप) कॉल करता है।
मैं जो निष्कर्ष पर आया हूं वह यह है कि आपको वास्तव में क्या करना चाहिए, यह सुनिश्चित करें कि आपके व्यापार तर्क परत को सही ढंग से डिकोड किया गया है। मेरे कोड को देखते हुए, मैं पहले से ही ऐसा करता हूं - नियंत्रक GetUser()
एक प्रबंधक को कॉल करेगा , फिर इसे व्यू व्यू के साथ रेंडर करने के लिए एक व्यू मॉडल बनाएं। तो सच में, व्यापार तर्क परत है एक API। यदि आप इसे डेस्कटॉप ऐप से कॉल करना चाहते हैं, तो आपको इसे कॉल करने की सुविधा के लिए WCF सेवा जैसा कुछ लिखना होगा। यहां तक कि सिर्फ एक WCF विधि कहा जाता GetUser()
है जिसमें कोड return MyBusinessLayer.GetUser()
पर्याप्त होगा। तो एपीआई व्यावसायिक तर्क है, और डब्ल्यूसीएफ / वेब एप आदि बाहरी कोड को कॉल करने के लिए कोड के केवल शीर्षक हैं।
इसलिए कुछ ओवरहेड है, जिसमें आपको अपनी एपीआई के आधार पर अपने व्यापार तर्क परत को अलग-अलग एपीआई में लपेटना होगा, और आपको प्रत्येक ऑपरेशन के लिए एक एपीआई विधि लिखनी होगी, जिसे आप अपने अन्य एप्लिकेशन को करना चाहते हैं, इसके अलावा आपको आवश्यकता होगी प्रमाणीकरण करने का एक तरीका अलग करें, लेकिन अधिकांश भाग के लिए यह समान है। एक अलग प्रोजेक्ट (क्लास लाइब्रेरी) में अपने व्यावसायिक तर्क को चिपकाएं, और आपके पास शायद कोई मुद्दा नहीं होगा!
उम्मीद है कि यह व्याख्या सही है। सभी चर्चा / टिप्पणियों के लिए धन्यवाद जो इसे उत्पन्न किया है।