मेरे MVC अनुप्रयोग के लिए एक सेवा परत बनाना?


82

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

ऐसा लगता है कि व्यापार तर्क में वास्तव में जगह नहीं है ... इसलिए मैं सोच रहा हूं कि सेवाओं के लिए एक और परत उपयुक्त होगी। मुझे यकीन नहीं है कि इस परत को कहां रखा जाए, या सेवाओं का निर्माण कैसे किया जाए - क्या यह "सेवाओं" नामक एक वर्ग होना चाहिए जिसमें कार्यों का एक समूह होता है? मैं MVC के लिए थोड़ा नया हूं, इसलिए किसी भी पठन सामग्री, नमूने, या सामान्य नवागंतुक प्रकार की युक्तियां भयानक होंगी।

जवाबों:


126

मैं आमतौर पर ASP.NET MVC एप्लिकेशन को विकसित करते समय एक सर्विस लेयर का उपयोग करता हूं। यह सर्विस लेयर पैटर्न के समान है, जो मार्टिन फॉलर ने पैटर्न ऑफ एंटरप्राइज एप्लीकेशन आर्किटेक्चर में चर्चा की है । यह आपके व्यापार तर्क को संकुचित करता है और नियंत्रकों को बहुत पतला बनाता है। मूल रूप से नियंत्रक डोमेन मॉडल प्राप्त करने के लिए सेवा परत का उपयोग करते हैं जो तब दृश्य मॉडल में बदल जाते हैं। मैं लेन-देन और रिपोजिटरी डिज़ाइन पैटर्न को संभालने के लिए यूनिट ऑफ़ वर्क डिज़ाइन पैटर्न का भी उपयोग करता हूँ ताकि आसान यूनिट टेस्टिंग के लिए डेटा एक्सेस लेयर को एनकैप्सुलेट किया जा सके और आसानी से ORM की अदला-बदली की जा सके। यह आंकड़ा उन विशिष्ट परतों को दिखाता है जो मैं एमवीसी एप्लिकेशन में उपयोग करता हूं।

MVC आर्किटेक्चर

इस आरेख में सेवा परत को "एप्लिकेशन या डोमेन लेयर" के रूप में लेबल किया गया है क्योंकि मुझे लगता है कि लोग "सेवा परत" शब्द का उपयोग करते समय भ्रमित हो जाते हैं। वे सोचते हैं कि यह एक वेब सेवा है। यह वास्तव में एक असेंबली है जिसका उपयोग आपकी पसंदीदा वेब सेवा तकनीक जैसे ASP.NET Web API या WCF और साथ ही एक नियंत्रक द्वारा किया जा सकता है।

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


7
वहाँ एक अच्छा उदाहरण है कि इस पद्धति को लागू करता है?
अनिमेश

@ अनिमेश आपके पास नेट, EF + कोड फर्स्ट या POCO टेम्पलेट के लिए DAL, T4Scaffolding जनरेटिंग रिपॉजिटरी और UnitOfWork के उदाहरणों के साथ रचना करने के लिए है, सेवा सिर्फ समन्वय betwenAL और POCO encapsulating व्यावसायिक तर्क है। फिर ASP.NET MVC कंट्रोलर या WebApi जो केवल सर्विस लेयर को कॉल करते हैं और परिणाम (ASP.NET MVC) दिखाते हैं या इसे अन्य क्लाइंट (ASP.NET WebApi) में भेजते हैं
riadh gomri

2
रिपॉजिटरी और यूओडब्ल्यू अनावश्यक है, है ना? कम से कम आपके उदाहरण में, जब आपको केवल एक डेटाबेस तकनीक का उपयोग करना होगा (और यह डीडीडी नहीं है)। यही कारण है कि ईएफ ने पहले से ही यूओडब्ल्यू और रिपॉजिटरी पैटर्न को लागू किया है।
क्रिप्रू

1
मुझे यहां के बारे में नहीं पता है, क्योंकि मुझे उदाहरण और ग्राफिक पसंद हैं, लेकिन बहुत सारे ट्यूटोरियल ऑनलाइन रिपॉजिटरी पैटर्न का उपयोग अनावश्यक रूप से करते हैं। वे अमूर्त हैं क्योंकि वे बिना किसी लाभ के सार कर सकते हैं, बस इसलिए वे एक इंटरफ़ेस का उपयोग कर सकते हैं।
जॉनी

बहुत बढ़िया !!! शुक्रिया @kevin जुंगहंस, आपके जवाब ने वास्तव में मुझे वास्तुकार जटिल वेब एप्लिकेशन की मदद की। एक लघु प्रश्न, माइक्रो सेवा आधारित वेब ऐप विकसित करते समय, क्या हमें सेवा कक्षाएं लागू करने की आवश्यकता है या केवल एमवीसी कक्षाएं काम करती हैं।
कोडिमिलन

28

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

 public class MyService : IMyService
 {
     IFirstDependency _firstService;
     ISecondDependency _secondService;

     public MyService(IFirstDependency firstService, ISecondDependency secondService)
     {
     }

     public Result DoStuf(InputDTO)
     {
         // some important logic         
     }
 }

फिर आप अपने नियंत्रकों से इन सेवाओं का उपभोग करते हैं। पूर्ण उदाहरण के लिए यहां देखें ।

रिपॉजिटरी के अनुसार - मेरी सलाह है कि यदि आप कुछ आधुनिक ORM (NHibernate, EntityFramework) का उपयोग करने जा रहे हैं, तो उनका उपयोग न करें, क्योंकि आपके व्यवसाय का तर्क सेवा लेयर में एनकैप्सुलेट हो जाएगा और आपका डेटाबेस ORM फ्रेमवर्क के साथ पहले से ही एनकैप्सुलेटेड हो जाएगा।


4
मुझे लगता है कि रिपॉजिटरी सेक्शन को छोड़ देने और ओआरएम के सही होने के साथ समस्या यह है कि आपकी सेवा कक्षाओं को सीधे ओआरएम संदर्भ मिलेगा, जिसका अर्थ है कि आपकी सेवा में उन सभी वर्गों को प्रत्येक सेवा के बजाय आपके द्वारा संदर्भ में खींची गई सभी तालिकाओं तक पहुंच होगी। केवल तालिकाओं के साथ काम करने वाले वर्ग को इसकी आवश्यकता होती है। आप DbSet के प्रत्येक वर्ग के ctor में पास होने और DI के साथ हल करने से इससे बच सकते हैं, लेकिन आप उस मुद्दे पर चल सकते हैं?
user441521


10

से हवाला देते हुए "व्यापार तर्क एक सेवा में, नहीं एक मॉडल में होना चाहिए"? :

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

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


यह सबसे अच्छा जवाब है। चयनित व्यक्ति व्यवसाय तर्क को नियंत्रक में उपयोग की जाने वाली सेवाओं पर रखने के लिए कहता है, लेकिन व्यावसायिक तर्क मॉडल पर होना चाहिए।
मेटुस फेलिप

3

लगता है कि आप एक रिपॉजिटरी पैटर्न जैसे कुछ के बाद होंगे। आप इसके बारे में यहां पढ़ सकते हैं:

http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/implementing-the-repository-and-unit-of-work-patterns-in-an-asp-net- MVC-आवेदन

यह उत्तर यहां भी मदद कर सकता है:

ASP.NET MVC के लिए सर्वश्रेष्ठ रिपोजिटरी पैटर्न


4
यह सिर्फ रिपॉजिटरी पैटर्न से कहीं अधिक है। सेवाएँ डेटा एक्सेस के बारे में भी हैं , लेकिन विशेष रूप से imho नहीं।
बोज
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.