2013-06-04 5 views
6

मुझे पता चला है कि कई मामलों में, ऐसा लगता है कि मेरे WPF-MVVM अनुप्रयोगों में मॉडल के लिए सिंगलेट या स्टेटिक कक्षाओं का उपयोग करने के लिए (कम से कम सतही रूप से) लगता है। अधिकतर, ऐसा इसलिए होता है क्योंकि मेरे अधिकांश मॉडलों को पूरे एप्लिकेशन में एक्सेस करने की आवश्यकता होती है। मेरे मॉडल static बनाना इस आवश्यकता को पूरा करने का एक आसान तरीका बनाता है।क्या एमवीवीएम के लिए स्थिर वर्ग या सिंगलेट का उपयोग करने का कोई बेहतर तरीका है?

और फिर भी, मैं विवादित हूं क्योंकि ग्रह पर हर कोई सिंगलेट से नफरत करता है। तो मैं सोच रहा हूं कि कोई बेहतर तरीका नहीं है, या अगर मैं कुछ गलत कर रहा हूं?

+3

"मॉडल" स्टेटिक बनाना ?? नहीं वास्तव में नहीं। थोड़ा सा भी नहीं। यह रेगएक्स के साथ [पार्सिंग एचटीएमएल] से भी बदतर है (http://stackoverflow.com/a/1732454/643085) –

+0

हे। मैं देख नहीं कर सका। – sircodesalot

+0

यदि डीआई का उपयोग करके इसे स्थैतिक बनाने की बजाय, कंटेनर नियंत्रक लाइफटाइम मैनेजर के साथ कंटेनर में पंजीकृत करें। स्थैतिक के साथ, आपको थ्रेड सुरक्षा के साथ अधिक समस्या है। –

उत्तर

5

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

  1. थ्रेड सुरक्षा। यदि आपके पास ग्लोबल-स्टेटिक सिंगलटन है, तो इसे थ्रेड-सुरक्षित होना चाहिए क्योंकि किसी भी समय इसे किसी भी चीज़ तक पहुंचा जा सकता है। यह अतिरिक्त ओवरहेड है।

  2. यूनिट परीक्षण सिंगलेट्स के साथ अधिक कठिन है।

  3. यह वैश्विक चर के लिए एक सस्ता प्रतिस्थापन है (मेरा मतलब है, यह दिन के अंत में एक सिंगलटन है, हालांकि इसमें विधियां और अन्य फैंसी चीजें हो सकती हैं)।

देखें, ऐसा नहीं है कि सिंगलटन की फिल्म कर रहे हैं "भयंकर घृणित कामों" प्रति-se, लेकिन यह पहली डिजाइन पैटर्न कई नए प्रोग्रामर से निपटने के लिए मिलता है और उसके 'सुविधा obfuscates अपनी' नुकसान (बस कुछ गियर पर चिपके रहते हैं कि यह और इसे भाप-पंक कहते हैं)।

अपने मामले में, आप मॉडल का जिक्र कर रहे हैं और ये हमेशा "उदाहरण" होते हैं क्योंकि वे स्वाभाविक रूप से डेटा को प्रतिबिंबित करते हैं। शायद आप इन उदाहरणों को प्राप्त करने की लागत के बारे में चिंतित हैं। मेरा विश्वास करो, वे नगण्य होना चाहिए (स्पष्ट रूप से डेटा-एक्सेस डिज़ाइन तक)।

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

सिंगलटन दुनिया में, उस सिंगलटन में एक ही बदलाव मूल रूप से कोड-बेस में सब कुछ तोड़ सकता है। अच्छी बात नहीँ हे।

+0

अच्छा। मैं यह भी कहूंगा: कभी भी सिंगलटन का उपयोग न करें जब तक कि आपके पास कोई दूसरा विकल्प न हो। –

2

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

वहाँ wpftutorial.net पर एक अच्छा ट्यूटोरियल पता चलता है कि कैसे WPF में निर्भरता इंजेक्शन करना है: http://wpftutorial.net/ReferenceArchitecture.html

+0

दिलचस्प। मैंने कुछ सप्ताह पहले डीआई सीखना शुरू कर दिया था। ऐसा लगता है कि मैं उस बैक अप को उठाऊंगा। धन्यवाद। – sircodesalot

2

एकमात्र स्थिर वर्ग जो मैं उपयोग करता हूं वह एक संदेश ब्रोकर है क्योंकि मुझे एप्लिकेशन के माध्यम से एक ही उदाहरण की आवश्यकता है।

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

यह आपको आवश्यक होने पर विभिन्न संस्करणों को इंजेक्ट करने की अनुमति देता है (उदा।यूनिट परीक्षण के दौरान)

बीटीडब्ल्यू: स्थैतिक एकलटन के समान नहीं है। लेकिन मैं उसमें नहीं जा रहा हूं। उस पर अधिक मजेदार प्रश्नों के लिए बस स्टैक ओवरफ्लो खोजें :)

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

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