2009-12-22 14 views
5

हम एंटिटी फ्रेमवर्क (आरआईए सेवाओं के साथ सिल्वरलाइट सटीक होने के लिए) का उपयोग कर एक डब्ल्यूपीएफ एप्लीकेशन लिख रहे हैं। हम एप्लिकेशन के माध्यम से एक साझा ऑब्जेक्ट कॉन्टेक्स्ट का उपयोग कर रहे हैं ताकि हम मॉड्यूल में डेटा साझा करने से लाभ उठा सकें।विंडोज़/डब्ल्यूपीएफ/सिल्वरलाइट एप्लिकेशन में एंटीटी फ्रेमवर्क ऑब्जेक्ट कॉन्टेक्स्ट

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

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

संपादित करें: ठीक है, EventAggregator, लेकिन फिर, इससे अन्य सभी हिस्सों को उनके (शायद अधिकतर डुप्लिकेट) डेटा को फिर से लोड करने का कारण बन जाएगा। इसके अलावा सभी प्रकार के entites समूहों के लिए शायद कई घटनाओं की आवश्यकता होगी।

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

क्या कोई तरीका है कि कैसे अपने डेटाकॉन्टेक्स्ट से इकाइयों को "रिलीज़" करें ताकि कचरा कलेक्टर अपना काम कर सके और स्मृति जारी कर सके?

उत्तर

2

रुको, क्या यह डब्ल्यूपीएफ या सिल्वरलाइट है? इस मामले में, वे बहुत अलग हैं और मेरा जवाब अलग होगा।

WPF समाधान

WPF में मैं प्रपत्र प्रति एक भी ObjectContext पैदा करेगा। इस तरह, संदर्भ केवल तब तक ही टिकेगा जब तक फॉर्म स्वयं ही होगा। आपको तब एक इवेंट सिस्टम लागू करना चाहिए ताकि जब आप किसी इकाई में परिवर्तनों को सहेजते हैं तो आप उन अन्य फॉर्मों को अलर्ट कर सकते हैं जिन्हें उन्हें अपने डेटा को रीफ्रेश करने की आवश्यकता हो सकती है (उदाहरण के लिए INotifyPropertyChanged)। Oren Eini wrote a pretty good article on this architecture using NHibernate in MSDN magazine। आपको अपने लेख से वास्तुकला अवधारणा प्राप्त करने में सक्षम होना चाहिए।

सिल्वरलाइट समाधान

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

सर्वर पर, आप वेब सेवा में इकाई फ्रेमवर्क ऑब्जेक्ट कॉन्टेक्स्ट का उपयोग करते हैं और इसे केवल एक अनुरोध की अवधि के लिए रहना चाहिए। जितना अधिक स्टेटलेस आप अपनी सेवाओं को बना सकते हैं, वे अधिक स्केलेबल और कलाकार होंगे। आप अपना ईएफ ऑब्जेक्ट कॉन्टेक्स्ट खोलना चाहते हैं, इसका इस्तेमाल करें, और जितनी जल्दी हो सके इसे बंद करें।


संपादित करें:

तो वस्तु संदर्भ से एक वस्तु अलग है, तो आप सिर्फ context.Detach(entity) विधि का उपयोग कर सकते है तुम सब करने की इच्छुक रहे हैं। आप example of how to do this on MSDN पा सकते हैं।

+0

इस एप्लिकेशन के साथ, हम सिल्वरलाइट के बारे में बात कर रहे हैं। प्रिज्म/कैलिबर्न का उपयोग करके, मेरा मानना ​​है कि एक ऑब्जेक्ट कॉन्टेक्स्ट प्रति दृश्य (मॉड्यूल?) रखने में कोई समस्या नहीं है। फिर, समस्या यह है कि अगर ग्राहक को बहुत सारे डेटा लोड किए जाएंगे? जहां तक ​​मैं अब हूं, सबसे अच्छा समाधान उन सभी मूल संस्थाओं के लिए साझा ऑब्जेक्ट कॉन्टेक्स्ट बनाना होगा जो पूरे एप्लिकेशन के माध्यम से उपयोग किए जाते हैं ताकि ये स्वचालित रूप से सिंक्रनाइज़ हो जाएं, और ऑब्जेक्ट कॉन्टैक्स को डेटा के बड़े समूह को लोड करने के लिए अलग करें। कुछ ऐतिहासिक रिपोर्टें। – gius

+0

मैं ग्राहक को डेटा के वास्तव में बड़े ब्लॉक भेजने की कोशिश नहीं करता। इसके बजाए, मैं सर्वर पर फ़िल्टर करता हूं और केवल उस परिणाम को वापस कर देता हूं जो ग्राहक उस पल में देखना चाहता है। मनुष्य 100,000 रिकॉर्ड नहीं पढ़ सकते हैं, इसलिए उन लोगों को मानव को न भेजें। इसके बजाए, समस्या को एक खोज/फ़िल्टर दें और केवल क्लाइंट को परिणाम भेजें। यदि आप रिपोर्ट बना रहे हैं, तो सर्वर पर कुल सारांश डेटा बनाएं। उदाहरण के लिए, सर्वर पर मासिक बिक्री वॉल्यूम की गणना करना बेहतर होगा और 5000 बिक्री रिकॉर्ड देखने के बजाय ग्राहक को एक ही नंबर भेजना बेहतर होगा। –

+0

यह सच है, लेकिन यदि उपयोगकर्ता किसी भी समय एप्लिकेशन जीवन के दौरान देखता है तो मान लें कि पेज 1, 10, 20, वे डेटा अभी भी स्मृति में होंगे। दूसरी ओर, एक अलग ऑब्जेक्ट कॉन्टेक्स्ट और डेटा पेजिंग का उपयोग करके बड़े डेटा-रहने-इन-मेमोरी समस्या को हल कर सकते हैं। – gius

1

आप रिपोजिटरी पैटर्न का उपयोग कर सकते हैं। यूआई और डीएएल के बीच अमूर्तता की एक अतिरिक्त परत।

भंडार में स्थिर और अवलोकन योग्य डेटा संग्रह बनाएं। फिर जब भी रिपोजिटरी उनमें से किसी को अद्यतन करता है, तो UI परत को पकड़ना चाहिए। एक विचार है।

+0

यह मेरी समस्या का समाधान नहीं करता है - संग्रह, क्लाइंट पर रहना होता था इसलिए यदि कोई उदाहरण है डेटाबेस में 1 जीबी डेटा, जल्दी या बाद में, यह क्लाइंट पर भी लोड किया जाएगा। दूसरी तरफ, यह एक संभावित समाधान दिखा सकता है। विचार के लिए धन्यवाद! – gius

0

ऑब्जेक्ट कॉन्टेक्स्ट में अवलोकन करने योग्य चयन का उपयोग करें। NotifyPropertyChange पर ट्रिगर्स करने वाली एक ईवेंट का उपयोग करें। परिवर्तन के बारे में सूचित करने के लिए दृश्य मॉडल के बीच एक प्रकाशित/सब्सक्राइब पैटर्न का उपयोग करें और अन्य विचारों को अपडेट करने के लिए इसका उपयोग करें।

+1

ईएफ द्वारा बनाए गए सभी संग्रह पर्यवेक्षण योग्य हैं और संस्थाएं NotifyPropertyChanged का उपयोग करती हैं। समस्या यह है कि मैं पूरे एप्लिकेशन लाइफसाइक्ल के दौरान केवल ऑब्जेक्ट कॉन्टेक्स्ट का उपयोग नहीं कर सकता क्योंकि तब एप्पल से लोड होने के बाद स्मृति से कोई डेटा जारी नहीं किया जाएगा। दूसरी ओर, प्रत्येक एकल क्रिया के लिए अलग ऑब्जेक्ट कॉन्टेक्स्ट का उपयोग करके ताज़ा डेटा में समस्याएं पैदा होंगी - एक ही डेटा कई स्थानों से कई बार लोड किया जाएगा और सिंक्रनाइज़ेशन का मतलब हर प्रकार के डेटा के लिए कस्टम ईवेंट होगा। मुख्य प्रश्न यह है कि इस समस्या के लिए कोई ढांचा/पैटर्न है। – gius

0

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

के बारे में वस्तु संदर्भ जीवन समय एक महान लेख: http://www.silverlightshow.net/items/Silverlight-WCF-RIA-Services-strategies-for-handling-your-Domain-Context-part-one.aspx

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