ASP.NET MVC - क्या नियंत्रकों में व्यावसायिक तर्क मौजूद होना चाहिए?


97

डेरिक व्हिटेकर ने कुछ दिनों पहले एक लेख पोस्ट किया था जो एक बिंदु पर हिट हो गया था जो मुझे कुछ समय के लिए उत्सुक था: क्या व्यापारिक तर्क नियंत्रकों में मौजूद हैं?

अब तक सभी ASP.NET MVC डेमो मैंने नियंत्रक में रिपॉजिटरी एक्सेस और बिजनेस लॉजिक को देखा है। कुछ ने सत्यापन को भी वहाँ फेंक दिया। यह काफी बड़े, फूला हुआ नियंत्रकों में परिणाम है। क्या यह वास्तव में MVC फ्रेमवर्क का उपयोग करने का तरीका है? ऐसा लगता है कि यह अभी बहुत सारे डुप्लिकेट कोड और तर्क के साथ समाप्त होने वाला है जो विभिन्न नियंत्रकों में फैला हुआ है।


लेख का लिंक मृत है - web.archive.org/web/20150906064521/http://devlicio.us/blogs/… किसी अन्य इच्छुक व्यक्ति के लिए आर्काइव.ऑर्ग से कॉपी है।
स्टुअर्ट मूर

जवाबों:


75

व्यापार तर्क वास्तव में मॉडल में होना चाहिए। आपको वसा मॉडल, पतली नियंत्रकों के लिए लक्ष्य होना चाहिए।

उदाहरण के लिए, होने के बजाय:

public interface IOrderService{
    int CalculateTotal(Order order);
}

मैं बल्कि होगा:

public class Order{
    int CalculateTotal(ITaxService service){...}        
}

यह मानता है कि कर की गणना बाहरी सेवा द्वारा की जाती है, और आपके मॉडल को आपकी बाहरी सेवाओं के लिए इंटरफेस के बारे में जानने की आवश्यकता होती है।

इससे आपका कंट्रोलर कुछ इस तरह दिखाई देगा:

public class OrdersController{
    public OrdersController(ITaxService taxService, IOrdersRepository ordersRepository){...}

    public void Show(int id){
        ViewData["OrderTotal"] = ordersRepository.LoadOrder(id).CalculateTotal(taxService);
    }
}

या कुछ इस तरह का।


1
तो क्या आप रिपॉजिटरी के बजाय अपने नियंत्रकों में सेवाओं को इंजेक्ट करेंगे? उस मामले में यूनिट ऑफ़ वर्क सिद्धांत कैसे चलता है?
केविन पैंग

मैंने कुछ और चीजें लिखी हैं, मुझे आशा है कि यह अधिक समझ में आता है। आप यह भी पढ़ सकते हैं: weblog.jamisbuck.org/2006/10/18/skinny-controller-fat-model भले ही यह रेल के बारे में है लेकिन यह अभी भी बहुत लागू है।
जोंणी

मैं व्यक्तिगत रूप से एक रिपॉजिटरी को एक सेवा कहूंगा।
ब्रैड विल्सन

वे निश्चित रूप से एक तरह की सेवा हैं, लेकिन विशेष रूप से डेटा एक्सेस के लिए हैं। यह सिर्फ एक कन्वेंशन है जिसका मैं उपयोग करता हूं, न कि मैं विशेष रूप से वकालत करता हूं।
जौनी

1
यह आपके मॉडल को ITaxService के साथ युग्मित करेगा। यदि आप किसी अन्य प्रोजेक्ट या अन्य dll में मॉडल का पुन: उपयोग करना चाहते हैं, तो आपके पास ITaxService कार्यान्वयन या संदर्भ होना चाहिए, अन्यथा आपका मॉडल टूट जाएगा, जिसके परिणामस्वरूप SOLID सिद्धांतों का उल्लंघन होगा। ITaxService में आपके मॉडल का संदर्भ होना चाहिए। इस तरह, आप ITaxService संदर्भ की आवश्यकता के बिना अन्य परियोजना में अपने मॉडल का पुन: उपयोग कर सकते हैं।
मेहमत अली सर्ट

65

मुझे Microsoft पैटर्न और अभ्यास द्वारा प्रस्तुत आरेख पसंद है । और मेरा मानना ​​है कि कहावत 'एक तस्वीर एक हजार शब्दों के लायक है'।

आरेख MVC और व्यवसाय सेविज़ परतों की वास्तुकला को दर्शाता है


6
यह वास्तव में उपयोगी है! क्या आप मुझे बता सकते हैं कि उस साइट पर आपको यह आरेख कहां मिला है?
रॉब चर्च

2
यह Microsoft के 'सर्वर-साइड कार्यान्वयन' msdn.microsoft.com/en-us/library/hh404093.aspx
जस्टिन

ठीक है, लेकिन कहते हैं, एक एमवीसी ऐप - व्यापार तर्क कहाँ जाता है? लगता है कि हम एक additoinal सेवा परत या कुछ और की जरूरत है ?!
निको

14

यह एक आकर्षक प्रश्न है।

मुझे लगता है कि इसका दिलचस्प यह है कि वास्तव में मॉडल में पूरी तरह से "व्यावसायिक तर्क" रखने के अर्थ में बड़ी संख्या में नमूना एमवीसी एप्लिकेशन वास्तव में एमवीसी प्रतिमान का पालन करने में विफल रहते हैं। मार्टिन फाउलर ने कहा है कि MVC गैंग ऑफ़ फोर के अर्थ में एक पैटर्न नहीं है। दरअसल, यह प्रतिमान है कि प्रोग्रामर पैटर्न जोड़ना होगा करने के लिए अगर वे एक खिलौना एप्लिकेशन परे कुछ बना रहे हैं।

तो, संक्षिप्त उत्तर यह है कि "व्यावसायिक तर्क" वास्तव में नियंत्रक में नहीं रहना चाहिए, क्योंकि नियंत्रक के पास दृश्य और उपयोगकर्ता के इंटरैक्शन से निपटने का अतिरिक्त कार्य है और हम केवल एक उद्देश्य के साथ ऑब्जेक्ट बनाना चाहते हैं।

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


14

आप स्टीफन वाल्थर द्वारा इस भयानक ट्यूटोरियल की जांच कर सकते हैं जो सर्विस लेयर के साथ वैधता दिखाता है ।

अपने सत्यापन क्रियाओं को अपने नियंत्रक कार्यों से और एक अलग सेवा परत में स्थानांतरित करने का तरीका जानें। इस ट्यूटोरियल में, स्टीफन वाल्थर बताते हैं कि आप अपनी कंट्रोलर लेयर को अपनी कंट्रोलर लेयर से अलग करके किस तरह चिंताओं से अलग रह सकते हैं।


2
यह सबसे सही उत्तर है। मैं व्यक्तिगत रूप से नियंत्रक को सेवाओं को उजागर नहीं करने की वकालत करता हूं, इसके बजाय एक ViewModel अवधारणा का उपयोग करने के लिए चुनते हैं जैसे कि MVVP पैटर्न में पाया जाता है। एक परिदृश्य की कल्पना करें जहां आप डेस्कटॉप इंटरफ़ेस (जैसे, विंडोज़ फॉर्म या डब्ल्यूपीएफ) और एक वेब इंटरफ़ेस के साथ एक व्यावसायिक ऐप लिखना चाहते हैं। उस समस्या को हल करने से आप "पतला नियंत्रक" पैटर्न की ओर बढ़ जाते हैं, जैसा कि यहाँ भी बताया गया है। नीचे पंक्ति: किसी मॉडल या नियंत्रक में व्यावसायिक तर्क कभी न डालें और नियंत्रक में ऐसा कुछ भी न रखें जो आपके पास न हो।
सैम

9

बिजनेस लॉजिक को कंट्रोलर्स में समाहित नहीं किया जाना चाहिए। नियंत्रकों को जितना संभव हो उतना पतला होना चाहिए, आदर्श रूप से संरक्षक का पालन करें:

  1. डोमेन इकाई का पता लगाएं
  2. डोमेन इकाई पर अधिनियम
  3. परिणाम / वापसी के लिए डेटा तैयार करें

इसके अतिरिक्त नियंत्रकों में कुछ एप्लिकेशन लॉजिक हो सकते हैं।

तो मैं अपना व्यावसायिक तर्क कहाँ रखूँ? मॉडल में।

मॉडल क्या है? अब यह एक अच्छा सवाल है। कृपया Microsoft पैटर्न और अभ्यास लेख देखें (उत्कृष्ट खोज के लिए एलेजैंड्रो के लिए यश)। यहाँ मॉडल की तीन श्रेणियां हैं:

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

बेशक, एमवीसी एक प्रतिमान है जो विभिन्न किस्मों में आता है। मैं यहाँ क्या वर्णन करता हूँ MVC शीर्ष परत पर ही कब्जा कर रहा है, विकिपीडिया पर इस लेख की वीडियोग्राफी करें

आज, एमवीसी और इसी तरह के मॉडल-व्यू-प्रस्तोता (एमवीपी) सेपरेशन डिज़ाइन पैटर्न के अलगाव हैं जो विशेष रूप से एक बड़ी प्रणाली की प्रस्तुति परत पर लागू होते हैं। सरल परिदृश्यों में MVC सिस्टम के प्राथमिक डिजाइन का प्रतिनिधित्व कर सकता है, सीधे डेटाबेस में पहुंचता है; हालाँकि, अधिकांश परिदृश्यों में MVC में कंट्रोलर और मॉडल की सेवा या डेटा लेयर / टियर दोनों पर ढीली निर्भरता होती है। यह सब क्लाइंट-सर्वर आर्किटेक्चर के बारे में है


-1

यदि आप निर्भरता इंजेक्टर्स का उपयोग करते हैं, तो आपके व्यावसायिक तर्क उनके पास जाएंगे और इसलिए आपको स्वच्छ और स्वच्छ नियंत्रक मिलेंगे।

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