एमवीवीएम क्लैरिफिकेशन


15

हम अपना पहला WPF एप्लिकेशन लिखने जा रहे हैं और MVVM पैटर्न से परिचित हो रहे हैं। हमने कई Winform अनुप्रयोग बनाए हैं और हमारे पास एक वास्तुकला है जो हमारे लिए बहुत सफल रही है। हमें उस आर्किटेक्चर का अनुवाद करने या हमारे आर्किटेक्चर के कुछ टुकड़े एमवीवीएम मॉडल में फिट होने का निर्धारण करने में थोड़ी परेशानी हो रही है।

ऐतिहासिक रूप से हमारे पास एक गुई (मुख्य निर्वासन) है जो तब एक BusinessLogic dll को सूचित करता है। BusinessLogic एक वेब सेवा के माध्यम से DAL dll को सूचित करता है और DAL DB के साथ सहभागिता करता है। DAL, BusinessLogic और GUI सभी एक ही BusinessObjects dll को संदर्भित करते हैं।

एएसआई वास्तुकला

एमवीवीएम के लिए कुछ संक्रमण काफी सीधे आगे हैं। हमारे गुई में अभी भी विचार शामिल होंगे, हमारे BusinessOjbects में अभी भी मॉडल होगा और हमारा DAL अभी भी DB के साथ बातचीत करेगा (हालांकि उन्हें लागू करने की तकनीक बदल सकती है)।

जो हम सुनिश्चित नहीं हैं वह हमारा BusinessLogic घटक है। ऐतिहासिक रूप से यह GUI को तब कॉल करने के लिए कार्यों को विचारों में नियंत्रित करने के लिए प्रदान करेगा (यानी। GetCustomerList जो ग्राहक वस्तुओं या विशिष्ट CRUD कार्यों की सूची लौटाएगा)।

हमारे पास मुख्य लटका यह है कि क्या MVVM पैटर्न ViewModels को घर में रखने के लिए एक अतिरिक्त घटक के लिए कॉल करेगा या यदि हम बस अपनी सोच को बदलते हैं और ViewModels के लिए हमारे BusinessLogic घटक के रूप में हमने क्या उपयोग किया है?

क्या हमारा BusinessLogic घटक ViewModels का प्रतिनिधित्व करता है?


यह एक समस्या की तलाश में एक समाधान की तरह लग रहा है। क्या कोई मजबूर कारण है कि आप MVVM के लिए आगे बढ़ रहे हैं? मैं पैटर्न का प्रशंसक हूं लेकिन क्या आपका पिछला समाधान काम नहीं कर रहा था? दृश्य मॉडल पर्यवेक्षक प्रस्तुतकर्ता की तरह है। इसमें डेटा लॉजिक के जरिए प्रेजेंटेशन लॉजिक और सर्फेस डेटा होता है। यह आपके व्यवसाय तर्क के बारे में जानना चाहिए और उस स्तर तक पहुंचने में सक्षम होना चाहिए, लेकिन मैं व्यवसाय तर्क को दृश्य मॉडल में ही ध्वस्त नहीं करूंगा।
जेरेमी लाइकेंस

जवाबों:


19

सामान्य तौर पर, मैं व्यावसायिक तर्क को दृश्य मॉडल परत में नहीं रखूंगा। लेकिन "बिजनेस लॉजिक" शब्द भ्रामक है।

एरिक इवांस एक मॉडल का उपयोग करते हैं जहां व्यापार तर्क को दो श्रेणियों में विभाजित किया गया है

  • डोमेन लॉजिक - आपके द्वारा हल की जा रही वास्तविक समस्या डोमेन से संबंधित तर्क
  • एप्लिकेशन लॉजिक - इस तथ्य से संबंधित तर्क, कि आप एक एप्लिकेशन का निर्माण कर रहे हैं

उन्होंने एक लेखांकन अनुप्रयोग के उदाहरण का उल्लेख किया। खाते, पद, कर खाते, आदि के बारे में नियम डोमेन नियम, लेखांकन के क्षेत्र से संबंधित नियम हैं। CSV आयात / निर्यात के बारे में तर्क का लेखांकन के डोमेन से कोई लेना-देना नहीं है। ये नियम विशुद्ध रूप से मौजूद हैं क्योंकि हम एक सॉफ्टवेयर एप्लीकेशन का निर्माण कर रहे हैं। ये एप्लीकेशन लॉजिक के उदाहरण हैं।

डोमेन नियमों को कभी भी दृश्य मॉडल परत में नहीं जाना चाहिए। यदि आप MVVM पैटर्न का अनुसरण कर रहे हैं, तो डोमेन नियम, बिना प्रश्न के, मॉडल लेयर में चलते हैं।

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

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

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


1
बहुत बढ़िया जवाब। मुझे यह सुनिश्चित करने की बात पसंद है कि ViewModel में केवल प्रस्तुति तर्क है। क्या आप अपने एरिक इवांस पॉइंट से संबंधित कोई लिंक जोड़ सकते हैं?
user7676

मुझे संदेह है कि मुझे एक लिंक मिल सकता है, क्योंकि मेरा मानना ​​है कि मुझे यह उनकी पुस्तक, डोमेन-ड्रिवेन डिज़ाइन से मिला है। वैसे भी, मुझे लगता है कि यह डोमेन और एप्लिकेशन लॉजिक के बीच के विभिन्न का एक उत्कृष्ट उदाहरण है। पुस्तक पर यहाँ और अधिक पुस्तकें .google.dk
Pete

5

हाँ।

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

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

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

पहले मामले में, वह व्यू ऑब्जेक्ट VM ऑब्जेक्ट के लिए बाध्य होगा। VM को बाध्य ऑब्जेक्ट पर एक संपत्ति परिवर्तित घटना के लिए सुनना चाहिए। ऑब्जेक्ट परिवर्तन ईवेंट को मॉडल कॉल करने के लिए VM फ़ंक्शन में वायर्ड किया जा सकता है।

दूसरे मामले में (बटन क्लिक इवेंट), परिवर्तन (क्लिक) घटना को वीएम द्वारा उजागर किए गए फ़ंक्शन कॉल पर वायर्ड किया जा सकता है।

किसी भी तरह से, यह हमेशा एक ऐसी घटना है जो वीएम में अनुक्रम करती है जो तब मॉडल को कॉल करती है जो बदले में डीएएल / डीबी कहती है।

मैं इसे ऊपर लाता हूं क्योंकि कुछ WinForm कोड का उपयोग WinForm GUI के कोड-पीछे से सीधे DB परत पर कॉल करने के लिए किया जाता है। यह दृष्टिकोण उस अलगाव को तोड़ता है जो MVVM प्रदान कर रहा है।


पुष्टि के लिए धन्यवाद। हम इस बात की बारीकियों को समझते हैं कि व्यू व्यूमॉडल के साथ कैसे इंटरैक्ट करता है और बाइंडिंग मॉडल को रखेगा और "कॉलिंग" को छोड़ देगा।
user7676

मैंने देखा कि इस उत्तर ने एक वोट खो दिया। मैं उत्सुक होता अगर नीचेवाला क्यों टिप्पणी करता? या अगर वे इस दृष्टिकोण को साझा नहीं करते हैं तो शायद अपना जवाब जोड़ें।
user7676

1
मैं मानता हूं कि व्यापारिक तर्क परत को VM परत द्वारा दर्शाया जाता है, हालांकि मुझे लगता है कि आपके उत्तर के कुछ हिस्से भ्रामक हो सकते हैं। इस Viewलेयर का मतलब ViewModel या Model का विज़ुअल प्रतिनिधित्व है, इसलिए यह कहने के बजाय कि क्लिक इवेंट को VM पर फ़ंक्शन कॉल के लिए वायर्ड किया जाता है, एक बेहतर परिभाषा यह होगी कि VM में कमांड को एक बटन के रूप में प्रस्तुत किया जाए। दृश्य परत। इसके अलावा, मैं आमतौर पर अपनी मॉडल परत को सीधे डीएएल तक पहुंचने में सक्षम नहीं होना पसंद करता हूं, इसलिए मेरा आवेदन प्रवाह आमतौर पर जाएगा VM -> DAL -> DB, जहां VMऔर DALदोनों सादे Modelडेटा ऑब्जेक्ट का उपयोग करते हैं।
राहेल

4
मैं इस जवाब से असहमत हूं। ViewModel दृश्य का मॉडल है, इसमें व्यावसायिक लॉजिक नहीं बल्कि व्यू लॉजिक होता है। ViewModels प्रस्तुति परत का हिस्सा हैं
simoraman

1
@simoraman - एमवीपीवीएम पैटर्न आपके सुझाव के साथ संरेखण में है। मुझे लगता है कि MVPVM एक अच्छा पैटर्न है, लेकिन छोटे ऐप्स के लिए थोड़ा भारी है। मैं वास्तव में आपको अपने विचारों को एक उत्तर देने और इस प्रश्न में योगदान करने के लिए प्रोत्साहित करूंगा।

5

आप सही हैं कि आप अनिवार्य रूप से अपने BusinessLogic dll को अपने ViewModel लेयर के साथ बदल रहे हैं, हालांकि मुझे लगता है कि सबसे बड़ा अंतर जो आप सामना करेंगे, वह यह है कि View / UI लेयर आपके ViewModel / BusinessLogic लेयर के साथ कैसे इंटरैक्ट करता है।

WinForms में, GUI आपका अनुप्रयोग है, और अनुप्रयोग प्रवाह के लिए जिम्मेदार है। WPF / MVVM में, आपके ViewModels आप अनुप्रयोग हैं, और GUI ViewModels के साथ बातचीत करने के लिए सिर्फ एक उपयोगकर्ता के अनुकूल इंटरफेस बन जाता है।

उदाहरण के लिए, WinForms के साथ, आपके पास डेटाग्रिड और एक बटन हो सकता है, और जब आप उस बटन पर क्लिक करते हैं तो आप कॉल करते हैं BusinessLogicLayer.GetProducts()और परिणामी उत्पाद ऑब्जेक्ट्स को डेटा ग्रिड में लोड करते हैं।

WPF के साथ, आप एक ViewModel है जिसमें एक के लिए होता है ObservableCollection<Products>और एक ICommand GetProducts, और कमांड को क्रियान्वित दाल और लोड उत्पादों के संग्रह कहता है। लेकिन इसके लिए एक उपयोगकर्ता के अनुकूल इंटरफेस प्रदान करने के लिए, आप एक दृश्य बनाएंगे जो उत्पाद संग्रह के लिए डेटाग्रिड, और गेटप्रोडक्ट्स कमांड के लिए एक बटन का उपयोग करके आपके ViewModel को प्रस्तुत करता है।

मैंने अपने ब्लॉग पर Winforms से WPF में जाने पर मानसिकता में बदलाव के बारे में अपने ब्लॉग के लिए वास्तव में एक हालिया पोस्ट लिखा था , और मुझे लगता है कि अंतर को संक्षेप में प्रस्तुत करने का सबसे अच्छा तरीका इन चित्रों के साथ है:


1
मैं GlenH7 से सहमत हूं, यह WPF के साथ शुरू करने वाले किसी व्यक्ति के लिए एक अच्छा जवाब है। हमें व्यू और ViewModel के बीच बातचीत का प्रतिमान बदलाव मिलता है इसलिए यह वास्तव में मेरे द्वारा पूछे गए प्रश्न के विषय पर नहीं था।
user7676
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.