मैं MVC पैटर्न को C # WinForms एप्लिकेशन पर कैसे लागू कर सकता हूं?


11

मैं एक C ++ डेवलपर हूं जो GUIs को डिजाइन करने के लिए MVC पैटर्न का उपयोग कर रहा हूं।

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

वर्तमान में मैं जो करने की कोशिश कर रहा हूं, वह वर्ग है जिसे मैं एक दृश्य के रूप में WinForms के लिए दिया गया हूं, और पृष्ठभूमि में मॉडल और नियंत्रक के लिए एक वर्ग जोड़ें। हालांकि, मैं वास्तव में घटनाओं के साथ बातचीत करने के तरीके पर निश्चित नहीं हूं, जैसे एक बटन क्लिक। आमतौर पर मैं इन घटनाओं को नियंत्रक पर पुनर्निर्देशित करूंगा, और मेरे द्वारा किए जाने के बाद दृश्य पर एक क्रिया करें।

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

क्या मेरे लिए आपके पास कोई सलाह है? क्या सी # में विंडोज फॉर्म की मेरी समझ अभी काफी अच्छी नहीं है कि एमवीसी कार्यान्वयन की कोशिश की जा सके? क्या मैं प्रपत्रों को गलत भूमिका देता हूं? क्या MVC इस उपयोग के मामले के लिए केवल एक अनुपयुक्त वास्तुकला है?


1
ओटी सवाल। लेकिन WInforms क्यों? WPF का मतलब Winforms को बदलना और MVC (वेल तकनीकी रूप से MVVM) को सपोर्ट करना था। हालांकि मैं कहूंगा कि WPF सीखने की अवस्था खड़ी हो सकती है। (लेकिन अगर आप इसे बुरी तरह से करते हैं तो आप WPF कोड को विन्फॉर्म की तरह बना सकते हैं)
पीटर एम

1
@PeterM: क्योंकि 10 साल बाद भी WPF बेकार है और अभी भी धीमा है।
whatsisname

3
@ Whatsisname की टिप्पणी को समझने के लिए, WPF को बड़े अनुप्रयोगों की ओर बढ़ाया जाता है। Winforms के साथ छोटे एप्लिकेशन बेहतर तरीके से परोसे जा सकते हैं क्योंकि Winforms यकीनन सरल है। हालाँकि, यदि आप उस तर्क को बनाना चाहते हैं, तो आप यह तर्क भी दे सकते हैं कि आपका Winforms अनुप्रयोग काफी छोटा है जहाँ उसे वैसे भी MVV की आवश्यकता नहीं है। MVVM को WPF में बेक किया जाता है। WPF में वेक्टर-आधारित ग्राफिक्स हैं, इसलिए यह समान आकार की समस्याओं का सामना नहीं करता है जो Winforms करता है। WPF बहुत ही कंपोजेबल है (आप आसानी से अन्य नियंत्रणों के अंदर नियंत्रण रख सकते हैं), और इसे किलर डेटा बाइंडिंग मिला है। क्या पसंद नहीं करना?
रॉबर्ट हार्वे

3
@whatsisname WPF चूस सकता है, लेकिन यह एक खिलौना कार्यक्रम के ऊपर और ऊपर किसी भी चीज के लिए विनफॉर्म से बहुत कम चूसता है
पीटर एम

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

जवाबों:


3

संयोगवश, मैं एक WinForms परियोजना पर काम कर रहा हूं जो MVC के बाद बनाई गई है। मैं इसे एक सटीक उत्तर नहीं कहूंगा, लेकिन मैं अपने समग्र डिजाइन की व्याख्या करूंगा और उम्मीद है कि यह आपको अपने स्वयं के साथ आने में मदद कर सकता है।

इस परियोजना को शुरू करने से पहले मैंने जो रीडिंग की थी, उसके आधार पर इसे लागू करने का कोई "सही" तरीका नहीं है। मैंने सरल OOP और MVC डिजाइन सिद्धांतों का पालन किया और बाकी का परीक्षण और त्रुटि थी क्योंकि मैंने वर्कफ़्लो विकसित किया था।

क्या MVC इस उपयोग के मामले के लिए केवल एक अनुपयुक्त वास्तुकला है?

नहीं ..? उस प्रश्न का सीधा उत्तर देने के लिए आपके प्रश्न में पर्याप्त संदर्भ नहीं है। आप पहले स्थान पर एमवीसी का उपयोग क्यों कर रहे हैं? आपकी परियोजना की गैर-कार्यात्मक आवश्यकताएं क्या हैं? क्या आपका प्रोजेक्ट बहुत UI भारी होने जा रहा है? क्या आप सुरक्षा के बारे में अधिक परवाह करते हैं और यह एक स्तरित वास्तुकला है? आपकी परियोजना के मुख्य घटक क्या हैं? शायद प्रत्येक घटक को एक अलग डिज़ाइन पैटर्न की आवश्यकता होती है। पता करें कि आप पहली बार में इस डिज़ाइन पैटर्न का उपयोग क्यों करना चाहते हैं और आप अपने प्रश्न का उत्तर दे सकते हैं;)

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

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

मेरे कार्यान्वयन की शुरुआत एक उच्च स्तरीय डिजाइन से हुई जिसने मुझे इस बात का विचार दिया कि मुझे किन घटकों की आवश्यकता होगी। इस तरह से शुरू करने और आर्किटेक्चर में अपने तरीके से काम करने के लिए यह सबसे अच्छा है। यहाँ परियोजना के लिए पैकेज आरेख है (StarUML में बनाया गया है): यहाँ छवि विवरण दर्ज करें

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

अपने कार्यान्वयन के आधार के रूप में संचालन या आदेशों के बारे में सोचें। आप अपने आवेदन को क्या करना चाहते हैं? इसे सबसे बुनियादी कार्यों में तोड़ दें। उदाहरण के लिए: CreateProject, WriteNotes, SaveProject, LoadProject आदि GUI (या फॉर्म क्लासेस) कुछ ईवेंट (जैसे एक बटन प्रेस) होने वाले हैं। हर ऑपरेशन की एक नियंत्रक विधि होती है। इस मामले में Exit जैसा कुछ बहुत सरल है। आवेदन केवल फॉर्म क्लास से बंद किया जा सकता है। लेकिन क्या मुझे लगता है कि मैं पहली बार कुछ एप्लिकेशन डेटा को एक फ़ाइल में जारी रखना चाहता था? मैं अपने बटन प्रेस विधि के भीतर संबंधित नियंत्रक वर्ग से "सेव" विधि को कॉल करूंगा।

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

एक बार सत्यापन और संबंधित ऑब्जेक्ट हेरफेर पूरा हो जाने के बाद, सेवा विधि नियंत्रक को एक संदेश कोड लौटाएगी। उदाहरण के लिए, MessageCodes.SaveSuccess। नियंत्रक और सेवा वर्ग दोनों डोमेन ऑब्जेक्ट्स और / या संचालन के सामान्य सेट पर आधारित थे जिन्हें एक साथ समूहीकृत किया जा सकता है।

उदाहरण के लिए: FileMenuController(ऑपरेशन: न्यूप्रोजेक्ट, सेवप्रोजेक्ट, लोडप्रोजेक्ट) -> ProjectServices(क्रिएटप्रोजेक्ट, पर्सिस्टप्रोजेक्टटॉइफाइल, लोडप्रोजेक्टफ्रेमफाइल)। Projectआपके डेटा मॉडल में एक डोमेन वर्ग कहां होगा। मेरे मामले में नियंत्रक और सेवा वर्ग स्थिर तरीकों के साथ गैर-तत्काल कक्षाएं थे।

फिर, नियंत्रक ऑपरेशन को संयुक्त राष्ट्र / सफलतापूर्वक पूरा करने के रूप में पहचानता है। अब, नियंत्रक की अपनी संदेश प्रणाली है जिसे वह प्रस्तुति परत के साथ बातचीत करने के लिए उपयोग करता है, इसलिए सेवा और प्रस्तुति परतों के बीच दोहरी निर्भरता है। इस स्थिति ViewStateमें ViewModelsपैकेज में बुलाया गया एक वर्ग हमेशा नियंत्रक द्वारा जीयूआई में वापस आ जाता है। इस स्थिति में जानकारी शामिल है: " क्या वह राज्य है जिसने आपने एप्लिकेशन को मान्य करने का प्रयास किया है? ", " आपके द्वारा किए गए ऑपरेशन के बारे में एक मानवीय पठनीय संदेश और यह सफल क्यों हुआ (त्रुटि संदेश) और एक ViewModelवर्ग " नहीं था

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

मुझे उम्मीद है कि यह आपको एक प्रारंभिक बिंदु देता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.