2010-06-03 10 views
21

MVVM प्रकाश के नवीनतम संस्करण में (वी 3 SP1) दोनों "फेंक()" और "निपटान (bool)" ViewModel कक्षा में तरीकोंसफाई बनाम में निपटान (bool) MVVM प्रकाश

चिह्नित कर रहे हैं इस विधि का अब और उपयोग न करें, इसे भविष्य के संस्करण में हटा दिया जाएगा। उपयोग ICleanup.Cleanup() के बजाय

इसका मतलब यह है कि IDisposable इंटरफ़ेस सभी ViewModel कक्षाएं कि GalaSoft.MvvmLight.ViewModelBase से प्राप्त कर रहे में लागू नहीं किया जाना चाहिए (और सफाई overrided किया जाना चाहिए)?

यदि हां, तो उपयोग-मॉडल उदाहरणों के लिए उपयोग नहीं किया जा सकता है ... शायद मुझे कुछ समझ में नहीं आया ... कृपया स्पष्ट करें ... इस तरह की सफाई के क्या फायदे हैं?

धन्यवाद।

उत्तर

27

मुद्दा ऐतिहासिक है। सबसे पहले मैंने सोचा कि सभी वीएम को आईडीस्पोजेबल होने के लिए मजबूर करना एक अच्छा विचार होगा। हालांकि, आईडीस्पोजेबल का एक अलग इरादा है: एक बार वीएम का निपटान हो जाने पर, यह उम्मीद की जाती है (सम्मेलन द्वारा) कि यह जल्द से जल्द कचरा इकट्ठा किया जाएगा। दोस्तों से बात करने के बाद, मुझे एहसास हुआ कि सभी वीएम को पहचानने योग्य बनाना एक गलती थी। यही कारण है कि मैंने ICleanup द्वारा IDisposable बदल दिया। आईसीलेनअप का इरादा वीएम को साफ करने का एक तरीका प्रदान करना है (उदाहरण के लिए अपने राज्य को लगातार भंडारण, धाराओं को बंद करना आदि ...) लेकिन जरूरी नहीं कि वे जितनी जल्दी हो सके कचरा इकट्ठा किया जाए।

कुछ भी आपको अपने वीएम को IDISposable लागू करने से रोकता है। मैं सिर्फ ViewModelBase क्लास में इस बाधा को नहीं रखना चाहता था, यही कारण है कि यह इंटरफ़ेस V4 में हटा दिया जाएगा।

आईसीलेनअप होने का लाभ यह है कि आप अपने सभी वीएम को ViewModelLocator.Cleanup() के एक कॉल में साफ़ कर सकते हैं। यह वीएम डेवलपर्स के लिए एक संकेत है कि वीएम को अपने वीएम के लिए क्लीनअप विधि प्रदान करने के बारे में सोचना चाहिए।

क्या यह समझ में आता है? चीयर्स, लॉरेंट

+0

टिप्पणी के लिए धन्यवाद, यह निश्चित रूप से भावना बनाने के लिए यदि आप अपने clening के बाद व्यावहारिक वी एम की आवश्यकता है ... लेकिन मैं एक कारण निपटाने के बिना यह साफ करने के लिए नहीं दिख रहा है। .. आमतौर पर मैं अपने बंद होने पर वीएम को डिस्पो कर रहा हूं ... मुझे इसे बंद किए बिना साफ करने की आवश्यकता क्यों है? मुझे किसी भी प्रतिक्रिया के साथ सराहना की जाएगी। एक बार फिर धन्यवाद। – Budda

+4

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

+0

धन्यवाद। यह अब स्पष्ट है – Budda

2

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

मुद्दा, जैसा कि बुद्ध बताता है, यह है कि आईडीस्पोजेबल एक-तरफा ऑपरेशन द्वारा आयोजित किया जाता है। एक बार ऑब्जेक्ट का निपटारा हो जाने के बाद, इसे अपने सार्वजनिक तरीकों पर ऑब्जेक्ट डिस्प्ले अपवाद को फेंक देना चाहिए। यदि आप जो करना चाहते हैं वह संसाधनों को फ्लश करना है ताकि आप ऑब्जेक्ट का पुन: उपयोग कर सकें, फिर क्लीनअप विधि समझ में आती है। हालांकि, मैं आवश्यक रूप से निपटान कार्यक्षमता को नहीं हटाऊंगा, जो एक अलग उद्देश्य प्रदान करता है।

+1

अप्रबंधित संसाधनों को अंतिम रूप देने के लिए जारी किए जाने की आवश्यकता है। आप निपटान के दौरान उन्हें जारी करने के लिए सिस्टम को भी मजबूर कर सकते हैं और इस मामले में अंतिम रूप देने को दबा सकते हैं ("निपटान" विधि के कार्यान्वयन पैटर्न देखें) – Budda

2

"दिलचस्प" छोटी कहानी: मेरी टीम पर प्रोग्रामर मिलते-जुलते घटनाओं से सदस्यता नहीं ले रहे थे, मैंने अपने विचार मॉडल पदानुक्रम को केवल धोखा दिया ताकि यह सही हो सके कि निपटान सही जगह है या नहीं।

कुछ परिस्थितियों में, एमईएफ और कुछ अन्य भयानक तरीकों के कारण निपटान करना मुश्किल था, हम अपने दृश्य मॉडल बनाते हैं। इससे मुझे आश्चर्य हुआ कि यह सही था।

DG Update: Dispose, Finalization, and Resource Management

बाद में, मैं एक WP7 के अनुप्रयोग पर कुछ सप्ताह के अंत में काम (जहाँ मैं MVVM लाइट का उपयोग करें) और लॉरेंट के परिवर्तन देखा था: और फिर वहाँ तथ्य यह है कि निपटान कुछ देखभाल की जरूरत है (और एक टुकड़ा) सही पाने के लिए है दिल का भी।

मुझे लगता है कि यह सही निर्णय है; IDISposable एक संदेश भेजता है कि "ग्राहक" को क्लास उपयोग को एक प्रयोग() में डालने और लपेटना चाहिए या अन्यथा उदाहरण ASAP के अपने हाथ धोना चाहिए।

मूल रूप से, मैं नीचे दिए गए धागे में स्वीकृत उत्तर के साथ सहमत हूं लेकिन फिर मुझे लगता है कि जेरेडपार सही था।

Using IDisposable to unsubscribe events

ल्यूक