2009-04-24 16 views
16

मैं एमवीपी पैटर्न का उपयोग करने के लिए कोशिश कर रहा हूँ और मैं एक डिजाइन समस्या में चल रहा हूँ। मैं एक ऐसा एप्लीकेशन विकसित कर रहा हूं जिसमें कई उपयोगकर्ता नियंत्रण होंगे। UserControls के पास स्वयं एक दूसरे के साथ कुछ लेना देना नहीं है और केवल वास्तविक मॉडल के उप-समूह का प्रतिनिधित्व करता है। जो मैंने पढ़ा है, उससे लोग कहते हैं कि आपको एक प्रेजेंटर प्रति व्यू का उपयोग करना चाहिए। ऐसा लगता है, लेकिन अगर मेरे पास 30 उपयोगकर्ता नियंत्रण हैं, तो क्या मैं वास्तव में 30 प्रस्तुतकर्ता चाहता हूं? फ्लिप तरफ, अगर मेरे पास 1 प्रेजेंटर और 1 व्यू है जो पूरे "एप्लिकेशन" व्यू का प्रतिनिधित्व करता है, तो मैं व्यू और प्रेजेंटर इंटरफेस फूला होगा। फिर प्रत्येक दृश्य को उन तरीकों को लागू करना होगा जिनके साथ इसका कोई लेना-देना नहीं है। मेरा सवाल यह है कि, एकाधिक UserControls को संभालने का कोई बेहतर तरीका है, या क्या मुझे प्रत्येक दृश्य के लिए केवल 1 प्रस्तुतकर्ता बनाना चाहिए?एमवीपी और कई उपयोगकर्ता नियंत्रण

उत्तर

13

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

अब, आप एक प्रस्तुतकर्ता प्रबंधक वर्ग हो सकता था शायद है कि आप प्रत्येक प्रस्तोता इंटरफ़ेस का उपयोग करने, like the Interface Segregation Principle राज्यों, या तो विरासत द्वारा (एक वैश्विक ठोस प्रस्तोता कि interfaces..which तरह के कई प्रस्तोता लागू करता है दे सकता है एक जिम्मेदारी का उल्लंघन करती है) या एकत्रीकरण (प्रत्येक इंटरफ़ेस के लिए अलग-अलग प्रस्तुतकर्ताओं होगा प्राप्त कार्यों होने और कार्यों मिलता है ... इस प्रकार वैश्विक इंटरफेस) या दोनों (वैश्विक प्रस्तोता एक एडाप्टर के कुछ किया जा रहा है का एक संयोजन)।

मुझे लगता है कि सबसे अच्छा समाधान है, हालांकि सिर्फ 30 विभिन्न प्रस्तुतकर्ताओं के लिए होगा।

+0

यहां खतरे, जो एक से अधिक बार देखा गया एक ही डेटा इकाई स्वतंत्र रूप से लोड हो रहा है किया जा सकता है। या क्या मैं इस बिंदु को याद कर चुका हूं? – Junto

+6

यदि आपने डेटा साझा किया है जिसे एकाधिक नियंत्रणों द्वारा उपयोग करने की आवश्यकता है, तो एक अलग परत होनी चाहिए जो उस डेटा को उनके पास सेवा प्रदान करे। सबसे आसान संभवतः कुछ डेटाफैचर ऑब्जेक्ट (या ऑब्जेक्ट्स) है जो सृजन पर प्रत्येक नियंत्रण के प्रस्तुति में पारित किया जाता है, जिससे वे आवश्यक डेटा का अनुरोध कर सकते हैं जब उन्हें इसकी आवश्यकता होती है। – McMuttons

+0

@Chap क्या आप – arjun

0

प्रत्येक दृश्य एक ही इंटरफ़ेस को लागू करने ... क्यों पूरे स्क्रीन है कि सभी नियंत्रण होता है के लिए एक प्रस्तुतकर्ता प्रत्येक नियंत्रण के लिए इंटरफेस को परिभाषित है, और नहीं नहीं है? प्रस्तुतकर्ता इंटरफेस परिभाषित प्रस्तुतकर्ता (और आप MVPC कर रहे हैं अगर एक नियंत्रक पर) पर क्या घटनाओं प्रत्येक दृश्य की आवश्यकता है, उचित ईवेंट हैंडलर्स के अनुसार प्रत्येक दृश्य पर घटनाओं "तार ऊपर" कर सकते हैं। तुम भी एक और इंटरफेस की जरूरत प्रस्तुतकर्ता कार्यक्षमता कि सभी दृश्य आम में करने के लिए उपयोग की जरूरत है प्रतिनिधित्व करने के लिए कर सकते हैं ...

  • आप MVPC कर रहे हैं तो घटनाओं कि मॉडल को प्रभावित wopuld "संभाला" जा नियंत्रक में देखने, जबकि घटनाओं को देखें जो केवल दृश्य के अन्य हिस्सों को प्रभावित करते हैं, प्रस्तुतकर्ता पर संभाले जाएंगे।
17

आप की वजह से नियंत्रण एक प्रस्तोता एक प्रति करना चाहिए:

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

वहाँ दो समस्याओं आमतौर पर निर्णय "नियंत्रण प्रति प्रस्तोता" से संबंधित उल्लेख कर रहे हैं:

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

इस में से हर एक में दृष्टिकोण नियंत्रण एक दूसरे को

+0

विचारों के बीच साझा संदर्भ और संचार का प्रदर्शन करने के लिए कुछ कोड दिखा सकते हैं, क्या आप दृश्य के बीच साझा संदर्भ और संचार का प्रदर्शन करने के लिए कुछ कोड दिखा सकते हैं – arjun

0

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

एक UserControl एक दृश्य नहीं है।

आपके आवेदन के प्रत्येक तार्किक क्षेत्र में एक प्रस्तुतकर्ता होना चाहिए; कैसे प्रत्येक टूट जाता है - कितने नियंत्रण, क्या पता चलता है कि - केवल रचना की एक चिंता का विषय है।

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