2010-05-20 14 views
7

मैं एक WPF अनुप्रयोग के विकास के बीच में हूं जो एंटीटी फ्रेमवर्क (.NET 3.5) का उपयोग कर रहा है। यह कई जगहों पर इकाइयों तक पहुंचता है। मैं संस्थाओं के संबंध में पूरे आवेदन में निरंतरता के बारे में चिंतित हूं। क्या मुझे अपने अलग-अलग विचारों में अलग-अलग संदर्भों को बढ़ावा देना चाहिए, या क्या मुझे (और ऐसा करने का एक अच्छा तरीका है) उदाहरण के लिए एक ही संदर्भ जिसे वैश्विक रूप से एक्सेस किया जा सकता है?WPF अनुप्रयोग में वैश्विक इकाई फ्रेमवर्क संदर्भ

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

यदि यह एक समग्र संदर्भ सुरक्षित है जिसके द्वारा शेष ऐप अपनी वस्तुओं को पुनर्प्राप्त करता है, तो मुझे लगता है कि यह जाने का तरीका है। यदि हां, तो उस उदाहरण को कहां रखा जाएगा? मैं वीबी.नेट का उपयोग कर रहा हूं, लेकिन मैं सी # बहुत अच्छा अनुवाद कर सकता हूं। किसी भी सहायता की सराहना की जाएगी।

मैं उन अनुप्रयोगों में से एक नहीं चाहता हूं जहां उपयोगकर्ता को नए डेटा प्राप्त करने के लिए ऐप के विभिन्न हिस्सों में एक दर्जन बार पुनः लोड करना होगा।

अद्यतन:

  1. सभी संदर्भों उनमें से निपटाने के लिए के बाद वे अब जरूरत हैं ब्लाकों का प्रयोग में बनाए जाते हैं:

    ठीक तो मैं इस प्रकार मेरे ऐप बदल दिया है।

  2. लोड होने पर, सभी इकाइयों को निपटाने से पहले संदर्भ से अलग कर दिया जाता है।
  3. MainViewModel (ContextUpdated) में एक नई प्रॉपर्टी एक ऐसी घटना को बढ़ाती है जो अन्य सभी ViewModels सदस्यता लेती है जो ViewModels RefreshEntities विधि को चलाती है।
  4. इसे लागू करने के बाद, मुझे त्रुटियां मिलनी शुरू हुईं कि एक इकाई को एक समय में एक चेंजट्रैकर द्वारा संदर्भित किया जा सकता है। चूंकि मैं यह नहीं समझ पाया कि कौन सा संदर्भ अभी भी इकाई का संदर्भ दे रहा था (क्या कोई संदर्भ सही नहीं होना चाहिए?) मैंने ऑब्जेक्ट को आईईएनटीटी विथ चेंजटेकर के रूप में डाला, और सेट चेंजटेकर को कुछ भी नहीं (शून्य) सेट किया।

यह वर्तमान समस्या के लिए जाने की है: जब मैं इकाई पर changeTracker नल, और फिर एक संदर्भ के लिए देते हैं, यह खो देता है यह राज्य बदल गया है और डेटाबेस से अपडेट कर दिया नहीं है। हालांकि अगर मैं परिवर्तन ट्रैकर को नहीं हटाता, तो मैं संलग्न नहीं कर सकता। मेरे पास अपना खुद का परिवर्तन ट्रैकिंग कोड है, इसलिए यह कोई समस्या नहीं है।

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

+0

यदि आप डाउनवोट करते हैं, तो मुझे स्पष्टीकरण पसंद आएगा। कम से कम यह मुझे बताएगा कि सड़क के आगे क्या नहीं करना है। – CodeWarrior

उत्तर

5

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

जहाँ तक एक ही edmx में अपने विभिन्न वस्तुओं डाल के रूप में -

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

पुनः लोड करने के लिए - उपयोगकर्ता को ऐसा कभी नहीं करना चाहिए। दृश्यों के पीछे आप एक नया संदर्भ खोल सकते हैं, डेटाबेस से ऑब्जेक्ट के वर्तमान संस्करण को फिर से लोड कर सकते हैं, यूआई एनएनडी में किए गए परिवर्तनों को लागू करते हुए इसे वापस सहेज सकते हैं।

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

+0

ठीक है, इसलिए यदि मैं एकाधिक संदर्भों का उपयोग कर रहा हूं, तो एक संदर्भ को डेटा को ताज़ा करने के लिए कैसे पता चलेगा। क्या मैं इसे अन्य संदर्भ द्वारा सेट किए गए एक प्रॉपर्टीchanged ईवेंट की निगरानी करूँगा? – CodeWarrior

+0

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

+0

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

3

अच्छा सवाल, कॉरी। मुझ से अंगूठे

इकाई फ्रेमवर्क आपको एक नि: शुल्क विकल्प देता है - आप या तो कई संदर्भों को कम कर सकते हैं या केवल एक स्थिर हो सकते हैं। यह दोनों मामलों में अच्छी तरह से काम करेगा और हाँ, दोनों समाधान सुरक्षित हैं। एकमात्र मूल्यवान सलाह जो मैं आपको दे सकता हूं वह है: दोनों के साथ प्रयोग, प्रदर्शन माप, देरी इत्यादि। और आपके लिए सबसे अच्छा विकल्प चुनें।यह मजेदार है, मेरा विश्वास करो :)

यदि यह समवर्ती कनेक्शन के साथ वास्तव में बड़े पैमाने पर आवेदन होने वाला है, तो मैं एक स्थिर संदर्भ या एक स्थैतिक, मूल संदर्भ और केवल कुछ अतिरिक्त लोगों का उपयोग करने के लिए सलाह दूंगा । लेकिन, जैसा कि मैंने उपरोक्त कुछ पंक्तियां लिखी हैं - यह आपकी आवश्यकताओं पर निर्भर है कि समाधान आपके लिए बेहतर है।

मैं सिर्फ उन आवेदन जहां उपयोगकर्ता हिट करने के लिए ऐप्लिकेशन के विभिन्न भागों में एक दर्जन बार फिर से लोड पाने के लिए है में से एक नहीं करना चाहती:

मैं विशेष रूप से अपने प्रश्न के इस भाग को पसंद किया नया डेटा

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

एंटिटी फ्रेमवर्क के साथ डब्ल्यूपीएफ वास्तव में सीखने के प्रयास के लायक हैं - कृपया यह पूछने में संकोच न करें कि क्या आपको कोई और चिंता है या नहीं।

+0

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

+0

हाय, शुरुआती लोगों के लिए सबसे अच्छा एमवीवीएम आलेख यह है: http://www.codeproject.com/KB/WPF/TreeViewWithViewModel.aspx यह जितना संभव हो उतना सरल है जितना आपको स्वयं से शुरू करने की आवश्यकता है । कृपया अपनी प्रगति की रिपोर्ट करें :) –

+0

वह आलेख एंटिटी फ्रेमवर्क के बारे में बिल्कुल नहीं है। यह एमवीवीएम और ट्री व्यू नियंत्रण के बारे में है। – CodeWarrior

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