2011-02-04 12 views
5

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

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

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

अभी हम विभिन्न डब्ल्यूडब्ल्यूएफ अधिसूचना कार्यक्रमों के जवाब देने के लिए विभिन्न व्यूमोडल्स का पालन करके इसे संभालने में कामयाब रहे हैं, और अपने अंतर्निहित मॉडल और संबंधित दृश्य मॉडल को ठीक करने के लिए अपनी पूरी कोशिश करते हैं। हमने सिंक्रनाइज़ ऑब्जेर्जेबल कोलेक्शन (एक here की तरह अस्पष्ट रूप से) की तरह कुछ चालें निकाली हैं, जो कक्ष देखता है (कहता है) सत्र। ऑब्जेर्जेबल कोलेक्शन और स्वचालित रूप से संबंधित सत्र दृश्य मॉडल बनाता है और उन्हें RoomViewModel.SessionViewModels संग्रह में रखता है। हम एक व्यूमोडेल फैक्ट्री का भी उपयोग कर रहे हैं, जो दृश्य मॉडल को कैश करता है और यह सुनिश्चित करता है कि सत्र दृश्य दृश्य जो एक दिए गए सत्र को लपेटता है, वही रहता है, भले ही अंतर्निहित सत्र ऑब्जेक्ट बदल जाए। (यदि यह महत्वपूर्ण है, तो हम एक व्यूमोडेल-पहला दृष्टिकोण का उपयोग कर रहे हैं, क्योंकि हमारे डब्ल्यूसीएफ अधिसूचनाओं द्वारा ट्रिगर किए गए व्यूमोडेल में हुए बदलावों के जवाब में नए यूआई तत्वों को बनाने के लिए हमें नए यूआई तत्वों का निर्माण करना है।)

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

ऐसा लगता है कि यह इस तरह का परिदृश्य है कि बहुत से लोगों को भागना होगा, और मुझे उत्सुकता है कि अन्य लोगों ने इसका सामना कैसे किया है। मैं शायद इसे बेहतर बनाने के लिए कुछ दृष्टिकोणों के बारे में सोच सकता हूं:

(1) क्लाइंट-साइड मॉडल को एक प्रकार के डेटाबेस के रूप में मानें जिसे पूरी तरह से सुसंगत रखा जाना चाहिए, और क्लाइंट-साइड डेटा एक्सेस लेयर को कार्यान्वित करना जिसका काम यह मॉडल को लगातार रखना है। मॉडल के सभी अपडेट, चाहे उपयोगकर्ता या सर्वर से, इस परत के माध्यम से जाना होगा। यह एंटीटी फ्रेमवर्क की तरह थोड़ा होगा, उस myRoom.Users.Add(myUser) में myUser.Room = myRoom स्वचालित रूप से सेट हो जाएगा, और इसके विपरीत, और आगे। (यह विशेष रूप से वह हिस्सा है जो ऐसा लगता है कि किसी के जैसा कहीं पहले से विकसित होना चाहिए था, हालांकि मुझे अभी तक यह नहीं मिला है।)

(2) सिंक में सभी टुकड़ों को रखने के लिए Truss या Obtics जैसे कुछ पर दुबला। बिल्कुल यकीन नहीं है कि यह अभी तक कैसे काम करेगा, लेकिन यह सिद्धांत में लगता है जैसे यह संभव होना चाहिए।

और ... और क्या? मैं इस समस्या को हल करने के लिए उपयोग किए गए पैटर्न या ढांचे के रूप में उत्सुक हूं।

उत्तर

3

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

मुझे अक्सर पता चलता है कि कोड के क्षेत्र, आमतौर पर विस्तार स्तर (जैसे किसी व्यक्ति वस्तु, आयु, नाम, Forename के गुण) पर, जहां दृश्य मॉडल वास्तव में कोई मूल्य नहीं जोड़ रहा है, जबकि अधिक कोर्स स्तर, यह दृश्य/खिड़कियों आदि संरचनाओं द्वारा मूल्य जोड़ता है ...

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

http://www.scottlogic.co.uk/blog/colin/2009/08/the-mini-viewmodel-pattern/

:

अंत में, यदि आप पाते हैं कि आप एक मुश्किल बंधन मुद्दे को हल करने के लिए एक दृश्य के मॉडल को पुन: पेश करने की जरूरत है, मैं एक साधारण पैटर्न, मिनी MVVM, एक स्थानीय दृश्य मॉडल लागू होता है के बारे में लिखा

आशा है कि मदद करता है।

+0

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

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

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