2012-12-12 17 views
7

इंटरनेट पर देखे गए डब्ल्यूपीएफ एमवीवीएम ऐप्स के उदाहरण वीएम को एक परत पर विचार करते हैं जो एक सेवा परत के साथ इंटरैक्ट करता है जो या तो बाहरी पुस्तकालय से "पुरानी" घटनाओं का उपयोग करता है, या इसके साथ बातचीत करता है वेब या HTTP का उपयोग कर वेब। लेकिन क्या होगा यदि मैं सभी एम, वी, वीएम, सेवा और अन्य भागों को स्वयं बनाता हूं? सेवा परत और व्यूमोडेल परत के बीच बातचीत को सही तरीके से कैसे बनाया जाए? क्या मैं सेवा में ObservableCollection<OrderModel> डाल सकता हूं और दृश्य के रूप में इसे देखने के लिए इसे वापस कर सकता हूं, या इसे खराब दृष्टिकोण माना जाता है और बेहतर विकल्प हैं?डब्ल्यूपीएफ एमवीवीएम अनुप्रयोग की सेवा परत में अवलोकन योग्य चयन

उत्तर

6

आप यह कर सकते हैं - निश्चित रूप से आप कर सकते हैं। ऐसी चीज करने का प्राथमिक कारण कई WPF अनुप्रयोगों में डुप्लिकेशंस को कम करना होगा।

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

सेवा परत वास्तव में उदाहरण को प्रतिस्थापित नहीं कर सकती है (यानी बड़े पैमाने पर परिवर्तनों के मामले में), क्योंकि यह अब संदर्भ का एकमात्र मालिक नहीं है - लेकिन यदि यह हो तो भी, उदाहरण को बदलना बहुत अधिक होगा किसी भी बाध्यकारी यूआई को संग्रह में तोड़ना है।

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

ठीक है, इसलिए कुछ प्रकार की प्रबंधन परत लिखना संभव है जो आपके लिए कनेक्शन प्रबंधित कर सकता है - लेकिन अपरिहार्य मतदान के अलावा, या शायद SQL सर्वर अधिसूचनाओं के अतिरिक्त जो आप उपयोग कर सकते हैं, मुझे विश्वास है कि कोड काफी जटिल हो सकता है ।

उसने कहा, यह वास्तव में निर्भर करता है - यह विशेष मुद्दा एक है, लेकिन यह हो सकता है कि आपके पास एक वास्तुकला और वातावरण हो जिसमें ऐसी चीजें बस कोई फर्क नहीं पड़ता।

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

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

0

मैं कई कारणों से ऐसा नहीं करूँगा। उन्हें यहां दस्तावेज किया गया है: Common mistakes with an observable collection

लेखक सेवा परत में उनका उपयोग करने सहित कई गलतियों के माध्यम से लोगों को उनके साथ बनाते हैं।

+0

आलेख "मॉडल में इसका उपयोग करना" अनुभाग में कहता है कि मॉडलों में ओसी का उपयोग करना बुरा है, लेकिन मैंने बिना किसी रूपांतरण के मॉडल को दिए जाने पर कई उदाहरण देखे हैं। सिफारिशों में से एक था: "यदि कोई मॉडल INotifyProperty लागू करता है, इसका उपयोग करें, अन्यथा, इसे परिवर्तित करें"। तो मॉडलों में देखने योग्य संग्रहों का उपयोग करके सभी लोगों द्वारा बुरा व्यवहार नहीं माना जाता है ... वैसे भी, सवाल यह है कि: वैकल्पिक तरीका क्या है, सही तरीका? – Athari

+0

मुझे विश्वास है कि वैकल्पिक तरीका (सही तरीका) IENumerable का उपयोग करना है। @PeteH की तरह सुझाव दिया गया है, अपने दृश्य मॉडल में उर्फ ​​को जितना संभव हो सके ओसी का उपयोग करने का प्रयास करें। और एक संग्रह दृश्य मॉड्यूल क्लास लिखें जो व्यूमोडल्स के ऑब्जेर्जेबल कोलेक्शन को ऑनकॉलेक्शन चेंज इत्यादि के साथ संपत्ति के रूप में उजागर करता है। – Heliac

2

मैं केवल उस बिंदु से एक पर्यवेक्षण चयन का उपयोग करने का लुत्फ उठाऊंगा जिस पर "अवलोकनयोग्य" पहलू प्रासंगिक है, जो आम तौर पर वीएम को वी को उजागर करता है। आगे स्टैक (यानी एम) के नीचे मैं चाहता हूं सूचियों और संग्रहों जैसी अधिक सामान्य चीजों के साथ चिपकने के लिए प्रेरित रहें (जब तक कि आपको विशेष रूप से चीजों की आवश्यकता नहीं होती)। किसी भी मामले में किसी पुराने आईनेमरेबल के आधार पर वीएम के लिए एक अवलोकन योग्य चयन बनाने के लिए यह काफी आसान है।

हालांकि एक उचित सवाल, विशेष रूप से सिस्टम में ऑब्जर्जेबल कोलेक्शन के प्लेसमेंट के रूप में। चयन नामस्थान यह सुझाव देगा कि माइक्रोसॉफ्ट विशेष रूप से इसे एक विशेष वर्ग (और निश्चित रूप से wpf-specific नहीं) के रूप में नहीं सोचता है।

+0

"पारंपरिक" सूचियों और संख्याओं से चिपकने वाली समस्या यह है कि मुझे अभी भी दृश्यमान के माध्यम से दृश्य को अपडेट करने की आवश्यकता है जब कुछ है सूची में जोड़ा गया; इसलिए व्यूमोडेल को सेवा द्वारा एक नए आइटम के बारे में अधिसूचित करने की आवश्यकता है। यदि मैं घटनाओं को जोड़ता हूं, तो यह अवलोकन संग्रह के खराब (और शायद छोटी गाड़ी) कार्यान्वयन की तरह दिखेगा ... – Athari

+0

@Athari मैं देख सकता हूं कि आप कहां से आ रहे हैं - यह निश्चित रूप से आपके स्वयं के पर्यवेक्षण को लागू करने के लिए कोई समझ नहीं आता है। ढेर को आगे देखकर, सेवा कैसे जानती है कि चीजें बदल गई हैं? – PeteH

+0

@Athari - यह वही है जो मैं करता हूं। जब मैं प्रोग्रामेटिक रूप से एक नया आइटम जोड़ता हूं (यानी डेटाग्रिड नई लाइन का उपयोग नहीं कर रहा हूं, लेकिन एक इकाई जोड़ रहा हूं), मेरे पास एक ऑनएन्टिटी एडवर्ड इवेंट है जिसे मैंने अपनी रिपोजिटरी में बनाएं विधि से फेंक दिया है: ** ऑनएन्टिटीएज्ड (नया मॉडल एंटीटीएडएडएन्ट आर्ट्स (इकाई)) ** । जैसा कि आप देख सकते हैं, इकाई घटना तर्कों में पारित की जाती है। मेरी सेवा परत इस घटना की सदस्यता लेती है। – Heliac

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