asp.net mvc वसा मॉडल/पतली नियंत्रक बनाम सेवा परत




asp.net-mvc asp.net-mvc-3 (3)

आगे बढ़ने से पहले आपको एमवीसी के बारे में कुछ और जानने की जरूरत है और चर्चा करें कि सबकुछ कहां रखा जाए। अच्छा, अगर आप पैटर्न का पालन करना चाहते हैं। अन्यथा आप अब पढ़ना बंद कर सकते हैं।

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

MVC

मॉडल मॉडल कुछ भी हो सकता है। यह एक webservice, आपके भंडार, आपकी सेवा कक्षाओं या बस अपने डोमेन मॉडल हो सकता है। मॉडल वह सब कुछ है जिसका उपयोग आपको आवश्यक जानकारी प्राप्त करने के लिए किया जाता है। केवल एक ही वस्तु के बजाय "मॉडल" को परत के रूप में देखें।

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

देखें व्यू केवल उपयोगकर्ता को जो प्रस्तुत करता है उसे प्रस्तुत करना चाहिए।

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

उत्तर

मॉडल एक दृश्य मॉडल नहीं बल्कि एक परत है। मॉडल में सब कुछ देखने के लिए आवश्यक जानकारी लाने के लिए उपयोग किया जाता है। नियंत्रक उस जानकारी को लेता है और इसे एक एकल दृश्य मॉडल में रखता है।

एक नियंत्रक कार्रवाई दृश्य द्वारा आवश्यक जानकारी को इकट्ठा करने में सक्षम होने के लिए "मॉडल" में एक या कई कॉल का उपयोग कर सकती है।

इसका मतलब है कि आपका दूसरा विकल्प सबसे सही है जब आप एक ऐसा एप्लिकेशन प्राप्त करना चाहते हैं जो बनाए रखना और विस्तार करना आसान हो।

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

https://code.i-harness.com

मैं कई वर्षों तक एंटरप्राइज़ एप्लिकेशन विकसित कर रहा हूं। नेट मेरे ऐप्स में आमतौर पर एक डोमेन मॉडल होता है जिसमें एसक्यूएल डीबी टेबल पर मैपिंग मैपिंग होती है। मैं एक रिपोजिटरी पैटर्न, निर्भरता इंजेक्शन और एक सेवा परत का उपयोग करें।

हाल ही में हमने एमवीसी 3 परियोजनाओं पर काम करना शुरू कर दिया और हमारे पास बहस थी कि कौन सा तर्क डालना है। मैं पतली नियंत्रक / एफएटी मॉडल वास्तुकला में आया था और सोच रहा था कि सेवा परत कैसे फिट होगी

विकल्प 1 - सेवाओं के लिए मॉडल वार्ता

नियंत्रक पतला है, मॉडलों पर कॉल तरीकों। मॉडल "पता" कैसे डीबी से खुद को लोड करने और भंडार या सेवाओं से बात करने के लिए। जैसे ग्राहक मॉडल में लोड (आईडी) विधि होती है और ग्राहक और कुछ बच्चे ऑब्जेक्ट्स जैसे GetContracts () लोड करती है।

विकल्प 2 - नियंत्रक सेवाओं के लिए बातचीत करता है

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

विकल्प 1 बेहतर विकल्प क्यों होगा, खासकर जब हम एंटरप्राइज़ सिक्योरिटीज के बारे में बात करते हैं तो मेरा अनुभव मुझे चिंताओं को अलग करने के लिए कहता है, मॉडल और नियंत्रकों को जितना संभव हो उतना पतला रखता है और बिजनेस लॉजिक (आईसीएल। डीबी इंटरैक्शन)

अच्छे संसाधनों के लिए सभी सलाहओं और संदर्भों के लिए धन्यवाद।


यह सब आपके आवेदन के इरादे और आवश्यकताओं पर निर्भर करता है।

उस ने कहा, "मिड स्केल" (स्थानीय रेस्तरां नहीं, और ट्विटर / फेसबुक नहीं) वेब अनुप्रयोगों के लिए मेरा सुझाव यहां दिया गया है।

  1. दुबला डोमेन मॉडलिंग

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

    एमवीसी में "मॉडल" का सबसे सटीक अर्थ यह है कि नियंत्रक को पता है कि इस मॉडल के बारे में पता है और इस प्रकार मॉडल के लिए क्या उद्देश्य है

    छोटे (अक्सर ट्यूटोरियल) अनुप्रयोगों में आपके "एप्लिकेशन / डोमेन मॉडल लेयर" के इकाई मॉडल अक्सर एक ही तत्काल ऑब्जेक्ट होते हैं जो नियंत्रक किसी व्यू को बंद कर देता है।

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

  2. मजबूत सेवा परत

    इसका मतलब मोटापे से तर्क नहीं है, लेकिन अच्छी तरह लिखित एकल उद्देश्य सेवाएं। मॉडल के बाहर सेवाओं में अपने व्यापार तर्क को कोडिंग करते समय यह "ओओपी" शुद्ध से थोड़ा अधिक "प्रक्रियात्मक" है, यह ढीले युग्मन, परीक्षण और लचीली तैनाती (पूर्व एन-स्तरीय तैनाती) के साथ बहुत मदद करता है।

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

  3. दुबला नियंत्रक

    मैं सुनिश्चित करता हूं कि मेरा नियंत्रक केवल कोच है , जिसमें यह न तो नाटक (सेवाएं) या खिलाड़ी (इकाई मॉडल या दृश्य मॉडल) है, लेकिन यह तय करता है कि कौन सी स्थिति और किस खेल को खेलता है। मेरे नियंत्रक दो चीजें करते हैं:

    1. कॉल सेवाओं जो इकाई / डोमेन मॉडल के साथ बातचीत करते हैं

    2. उपयुक्त दृश्य के लिए एक दृश्य मॉडल तैयार करें।

    यहां तक ​​कि प्रमाणीकृत / अधिकृत नियंत्रक क्रियाएं इंजेक्शन सेवाओं / विशेषताओं के माध्यम से भी की जाती हैं।

संपादित करें 1:

ध्यान रखें, इसका मतलब यह नहीं है कि आपका एंटिटी / डोमेन मॉडल एनीमिक होना चाहिए या नहीं। ओआरएम, भंडार और कारखानों, सत्यापन या राज्य यांत्रिकी का स्वागत है। इसका मतलब केवल मध्यम पैमाने के अनुप्रयोगों के लिए है, एमवीसी में मॉडल आपके व्यू को सौंपने के लिए नियंत्रक के लिए मॉडल का प्रतिनिधित्व करता है

उम्मीद है कि यह बिंदु फाउलर प्रेरितों को शांत करेगा जो एनीमिक डेटा मॉडल को एंटी-पैटर्न मानते हैं। साथ ही, यह ओओपी की तुलना में थोड़ा अधिक प्रक्रियात्मक कोण को प्रतिबिंबित करता है जहां मॉडलिंग वर्गों में व्यवहार शामिल करना अधिक शुद्ध है।

कोई "अंतिम सत्य" नहीं है, लेकिन इस पैटर्न का उपयोग करके आपको अपने अनुप्रयोगों को बनाने, परीक्षण करने और तैनात करना आसान लगेगा - बहुत सारी उपयोगिता और स्केलेबिलिटी को बनाए रखते हुए।

संपादित करें 2:

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

संपादित करें 3:

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


विकल्प 2 वसा बेवकूफ बदसूरत नियंत्रक वास्तुकला ( इस अभिव्यक्ति के लेखक के संदर्भ में ) के रूप में वर्णित है। यह समाधान आम तौर पर एमवीसी भावना के खिलाफ होता है क्योंकि यह चिंताओं को अलग करता है।





service-layer