नियंत्रकों और ViewModels के लिए, जो व्यापार तर्क के सबसे को शामिल करना चाहिए?
इनमें से कोई भी नहीं।
मैंने अपने व्यूमोडल्स को व्यावहारिक रूप से सभी व्यावसायिक तर्क रखने के कुछ तरीकों का प्रयास किया है। हालांकि, मुझे अपने व्यू मॉडेल के कन्स्ट्रक्टर में एक तर्क होना है जो कार्य का एक इकाई लेता है। यह एक अच्छा विचार है?
imho यह एक बहुत बुरा विचार है। सबसे पहले आप कई सोलिड सिद्धांतों को तोड़ रहे हैं। दृश्य मॉडल में सभी कोड को बंडल करना परीक्षण करना मुश्किल बनाता है। क्या होगा यदि आप किसी अन्य दृश्य में कुछ व्यावसायिक तर्क का उपयोग करना चाहते हैं? क्या आप उस कोड को डुप्लिकेट करते हैं?
यहां सबसे अच्छा अभ्यास क्या है?
चलिए पहले एमवीसी पैटर्न पर वापस जाएं। यह एक व्यापक परिभाषा है लेकिन यह जानकर आपको यह महसूस करना चाहिए कि आपको कहां रखना चाहिए।
एमवीसी में "मॉडल" वास्तव में डेटा को खींचने के लिए उपयोग की जाने वाली सभी चीजें हैं। यह webservices, एक व्यापार परत, भंडार आदि हो सकता है
दृश्य सभी कोड है जो HTML उत्पन्न करता है (चूंकि हम वेब के बारे में बात कर रहे हैं)।
नियंत्रक को मॉडल और दृश्य के बीच एक गोंद माना जाना चाहिए। इसलिए इसे मॉडल से जानकारी लेनी चाहिए और इसे दृश्य द्वारा उपयोग करने योग्य कुछ में बदलना चाहिए।
कि संरचना के साथ समस्या यह है कि यह करने के लिए "रिसाव" परत में विशेष जानकारी काफी आसान पैटर्न के अन्य भागों में है। इसलिए माइक्रोसॉफ्ट ने एमवीसी के कार्यान्वयन में व्यूमोडल्स पेश किए।
इस तरह हम विचारों से सभी प्रतिपादन तर्क हटा सकते हैं और इसे ViewModel में डाल सकते हैं। इसके बजाय अपने ध्यान में रखते हुए ऐसा करने का:
<span>@(model.Age == 0 ? "n/a" : model.Age)</span>
आप के बजाय ViewModel के अंदर है कि कोड डाल दिया और बस @model.Age
कहते हैं। इस तरह आपको अपने दृश्य मॉडल का उपयोग कर रहे सभी विचारों में उस कोड को डुप्लिकेट करने की आवश्यकता नहीं है।
व्यूमोडेल के बारे में आपके प्रश्न का उत्तर यह है कि इसमें केवल तर्क होना चाहिए जिसका उपयोग "मॉडल" से जानकारी को सही ढंग से प्रस्तुत करने के लिए किया जाता है।
नियंत्रक के रूप में, मैं इसमें कोई व्यावसायिक तर्क नहीं डालूंगा। सबसे पहले, यह आपके तर्क का परीक्षण करना बहुत मुश्किल बनाता है। फिर आप इसमें अधिक जिम्मेदारियां जोड़ते हैं (और एसआरपी तोड़ने से)। नियंत्रक में मान्य एकमात्र तर्क है ViewModel से जानकारी लेना और इसे "मॉडल" और इसके विपरीत उपयोग करने योग्य कुछ में बदलना।
आशा है कि आपके प्रश्न का उत्तर दें।
अद्यतन
मैं एक अलग परियोजना बनाने और इसे करने के लिए कक्षाओं में जोड़ना होगा। फिर बस अपने वेबप्रोजेक्ट से एक संदर्भ जोड़ें और उन वर्गों को नियंत्रकों में कॉल करें।
मैं स्वचालित रूप से मेरे लिए बनाई गई निर्भरताओं को प्राप्त करने के लिए नियंत्रण कंटेनर का एक उलटा उपयोग करना शुरू कर दूंगा।
Autofac दोनों आपके लिए सेवाओं (शून्य-कॉन्फ़िगरेशन) की खोज कर सकते हैं और स्वयं को एमवीसी में इंजेक्ट कर सकते हैं।
अलग इंटरफेस पैटर्न निम्नलिखित परियोजनाओं को बनाने का पालन करें:
- YourProject.BusinessLayer < - यहाँ अपनी कक्षाओं जोड़े
- YourProject.BusinessLayer.Specification < - आप इंटरफेस जोड़े हैं जो आपके व्यापार परत को परिभाषित करता है यहाँ।
- YourProject.Mvc < - एमवीसी प्रोजेक्ट।
"विशिष्टता" परियोजना (केवल कुछ वर्गों और जरूरी नहीं कि पूरे कारोबार परत हो सकता है) यह आसान चीजों का परीक्षण करने और यह आसान कार्यान्वयन स्विच करने के लिए बनाने के लिए बनाने के लिए इस्तेमाल किया जा सकता। "पृथक इंटरफ़ेस पैटर्न" पर पढ़ें
अच्छा जवाब। मैं पूछना चाहूंगा कि मेरा व्यवसाय तर्क कहां जाएगा? – TIHan
मेरा अपडेट पढ़ें। – jgauffin
धन्यवाद। मैं इसे देखना शुरू कर दूंगा। – TIHan