2010-04-27 14 views
12

मैं एस # एआरपी आर्किटेक्चर का उपयोग कर रहा हूं, और मुझे याद नहीं है कि मैंने इसे कहाँ पढ़ा है, लेकिन वे कहते हैं कि वे ViewModels को सेवा परत पर संग्रहीत किया जाना चाहिए, और आपके विचारों को प्रसंस्करण के लिए सेवा में व्यूमोडेल सबमिट करना चाहिए।कौन सी परत को एक मॉडल मॉडल बनाना चाहिए?

मेरा प्रश्न यह है। कौन सी परत ViewModel का निर्माण करना चाहिए? क्या यह सेवा परत पर होना चाहिए, और नियंत्रक इसका अनुरोध करता है? या नियंत्रक इसे स्वयं बनाना चाहिए? दृश्य मॉडल को अपडेट करने के बारे में एक प्रश्न भी है, जैसे कि इसमें संग्रह शामिल हैं, और मॉडल स्थिति अमान्य है, आपको किसी भी सूचियों को फिर से भरने की आवश्यकता होगी।

कोई सुझाव?

बहुत धन्यवाद

मैट

उत्तर

8

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

आप नियंत्रक में दृश्य मॉडल बनाने के विकल्प के लिए here देख सकते हैं। यह तकनीक दृश्य निर्माण के बाहर मॉडल निर्माण को आगे बढ़ती है, ताकि न केवल नियंत्रक क्रियाएं शुद्ध डोमेन ऑब्जेक्ट्स स्वीकार करें, लेकिन वे शुद्ध डोमेन ऑब्जेक्ट भी वापस कर दें। मैं नहीं कहूंगा कि यह सभी मामलों में उचित है, लेकिन सीखना बहुत दिलचस्प है।

ऑटोमैपर से संबंधित उपर्युक्त तकनीक ने "मुझे सेवा परत में व्यूमोडल पास करना चाहिए" जैसे प्रश्न उठाए। नहीं तुम नहीं करते यदि आपको जटिल ऑब्जेक्ट को सेवा या डोमेन परत पर पास करने की आवश्यकता है, तो आप इस ऑब्जेक्ट को उपयुक्त सेवा/डोमेन परत में परिभाषित करते हैं और उन परतों पर डेटा पास करने के लिए इसका उपयोग करते हैं। इस ऑब्जेक्ट को आसानी से दृश्य मॉडल से मैप किया जा सकता है (उदाहरण के लिए, ऑटोमैपर का उपयोग करके)। लेकिन आपकी निचली परतों (सेवा/डोमेन) को ऊपरी परतों (दृश्य/नियंत्रक) के साथ जोड़ा जाना चाहिए। इस मामले में नहीं, दूसरों में नहीं। कभी भी कम स्तर परतों को उनके ऊपर परिभाषित कुछ पर निर्भर नहीं होना चाहिए।

+0

यही है, लेकिन मैं कुछ करना ही होगा 'ViewModel बहाना' (एक और viewmodel अंदर viewmodel) & 'कमांड' इस में उल्लेख किया channel 9 link देखना चाहिए भी तलाश के लायक है गलत मॉडल के रूप में दृश्य मॉडल को ध्यान में रखते हुए मुझे बहुत सशर्त तर्क लगता है। शायद मुझे अपने दृश्य को छोटे हिस्सों में तोड़ने की जरूरत है। –

+0

मेरे पास वर्तमान में एक संपादन दृश्य है जो इकाई की स्थिति के आधार पर addapts। क्या मैं विभिन्न राज्यों के लिए कई विचार बनाने से बेहतर होगा? –

+0

अपने संपादन दृश्य और मॉडल को देखे बिना, जवाब देना मुश्किल है। – queen3

3

ये लेख आप के लिए दिलचस्प हो सकता है:

DDD : Command Query Separation as an Architectural Concept

Better Application Services and CQS using S#arp Architecture

वहाँ के बजाय, 2 लेख एक सेवाओं परत में देख सकते हैं और प्रपत्र मॉडल है कि के साथ जुड़े एक नमूना अनुप्रयोग है नियंत्रक।

+1

यह सही उत्तर है। हालांकि, मैं आमतौर पर नियंत्रक में व्यूमोडेल से शुरू करता हूं और इसे नियंत्रक के रूप में सेवा परत पर माइग्रेट करता हूं। –

+0

लिंक मौन पर नीचे हैं, शायद http://sharp-architecture.readthedocs.io/en/latest/additional-resources/additional-information.html मदद करेगा? – kristianp

0

Who Can Help Me पर भी देखें - यह शानदार है। यह ढांचा एस # आर्क आर्किटेक्चर पर आधारित है। इसमें अन्य चीजों के साथ व्यू/फॉर्म/व्यू व्यू मॉडल्स के लिए बहुत सारे मार्गदर्शन हैं।

11

पारंपरिक दृष्टिकोण या सिद्धांत के अनुसार, ViewModel उपयोगकर्ता इंटरफ़ेस परत का हिस्सा होना चाहिए। कम से कम नाम ऐसा कहता है।

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

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

मैं विकल्प बी के साथ जाता हूं विकल्प ए एक सरल तथ्य के कारण नो-नो है क्योंकि कई इकाई मॉडल एक व्यूमोडेल बनाने के लिए एक साथ मिलते हैं।हम यूआई परत में अनावश्यक डेटा पास नहीं कर सकते हैं, जबकि विकल्प बी में, सेवा डेटा के साथ खेल सकती है और मैपिंग (व्यूमोडेल में) के बाद केवल यूआई परत को आवश्यक/न्यूनतम पास कर सकती है।

लेकिन, मान लीजिए कि हम विकल्प ए के साथ जाते हैं, हम यूआई परत (और सेवा परत में इकाई मॉडल) में व्यूमोडेल डालते हैं।

यदि सेवा परत को ViewModel पर मैप करने की आवश्यकता है, तो सेवा परत को UI परत में ViewModel तक पहुंचने की आवश्यकता है। कौन सी पुस्तकालय/परियोजना? व्यूमोडेल यूआई परत में एक अलग परियोजना में होना चाहिए, और इस परियोजना को सेवा परत द्वारा संदर्भित करने की आवश्यकता है। यदि व्यूमोडेल एक अलग परियोजना में नहीं है, तो परिपत्र संदर्भ है, इसलिए कोई नहीं। सेवा परत को यूआई परत तक पहुंचने के लिए यह अजीब लगता है लेकिन फिर भी हम इसका सामना कर सकते हैं।

लेकिन क्या होगा यदि इस सेवा का उपयोग करके कोई और यूआई ऐप है? यदि मोबाइल ऐप है तो क्या होगा? ViewModel कितना अलग हो सकता है? क्या सेवा एक ही दृश्य मॉडल प्रोजेक्ट तक पहुंच सकती है? या सभी यूआई परियोजनाओं प्रतिस्पर्धा करेंगे?

इन विचारों के बाद मेरा उत्तर सेवा परत में व्यूमोडेल प्रोजेक्ट डालना होगा। प्रत्येक यूआई परत को सर्विस लेयर को किसी भी तरह एक्सेस करना होगा! और वहां बहुत सारे व्यूमोडल्स हो सकते हैं जिन्हें वे सभी उपयोग कर सकते हैं (इसलिए सेवा परत के लिए मानचित्रण आसान हो जाता है)। मैपिंग इन दिनों linq के माध्यम से किया जाता है, जो एक और प्लस है।

अंततः डीटीओ के बारे में यह चर्चा है। और ViewModels में डेटा एनोटेशन के बारे में भी। डेटा एनोटेशन के साथ ViewModels सेवा परत में नहीं रह सकता है। तो फिर डीटीओ दो के बीच एक मैपिंग (ऑटोमैपर के साथ कहें) के साथ व्यूमोडेल की एक सटीक प्रति होगी। फिर डीटीओ में यूआई (या एकाधिक अनुप्रयोग) के लिए आवश्यक तर्क है और सेवा परत में रहता है। और UI परत ViewModel केवल कुछ 'व्यवहार' (उदाहरण: विशेषता) के साथ डीटीओ से डेटा कॉपी करने के लिए है।

हालांकि सीधे प्रश्न से संबंधित नहीं है। काफी अब मैं क्या कर रहा हूँ: (48 प्रारंभ होने पर @ 11)

संबंधित मुद्दे