2008-09-23 13 views
54

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

क्या किसी ने विंडोज़ फॉर्म में एमवीसी लागू किया है? यदि हां, तो क्या आपके पास डिज़ाइन पर कोई सुझाव है?

+2

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

उत्तर

38

जो मैंने पहले किया है वह कुछ समान है, Model-View-Presenter

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

फॉर्म दृश्य है, और मेरे पास इसके लिए एक IView इंटरफ़ेस है। सभी प्रसंस्करण प्रस्तुतकर्ता में होता है, जो सिर्फ एक वर्ग है। फॉर्म एक नया प्रस्तुतकर्ता बनाता है, और प्रस्तुतकर्ता के IView के रूप में खुद को पास करता है। परीक्षण के लिए इस तरह आप नकली IView में पास कर सकते हैं, और फिर प्रस्तुतकर्ता से इसे कमांड भेज सकते हैं और परिणामों का पता लगा सकते हैं।

अगर मैं एक पूर्ण मॉडल-व्यू-नियंत्रक का उपयोग करने के लिए गए थे, मुझे लगता है मैं इसे इस तरह से करना चाहते हैं:

  • रूपदृश्य है। यह मॉडल को आदेश भेजता है, उन घटनाओं को बढ़ाता है जो नियंत्रक सदस्यता ले सकते हैं, और मॉडल से घटनाओं की सदस्यता ले सकते हैं।
  • नियंत्रक एक ऐसा वर्ग है जो दृश्य की घटनाओं की सदस्यता लेता है और दृश्यों को और मॉडल में आदेश भेजता है।
  • मॉडल दृश्यों को बढ़ाता है जो दृश्य सदस्यता लेता है।

यह the classic MVC diagram के साथ फिट होगा। सबसे बड़ा नुकसान यह है कि घटनाओं के साथ, यह बताना मुश्किल हो सकता है कि किसने सदस्यता ली है। एमवीपी पैटर्न घटनाओं के बजाय तरीकों का उपयोग करता है (कम से कम जिस तरह से मैंने इसे लागू किया है)। जब फॉर्म/व्यू एक ईवेंट उठाता है (उदा। कुछ बटन। क्लिक करें), फ़ॉर्म बस प्रस्तुतकर्ता पर एक विधि को इसके लिए तर्क चलाने के लिए कॉल करता है। दृश्य और मॉडल का कोई सीधा संबंध नहीं है; उन्हें दोनों को प्रस्तुतकर्ता के माध्यम से जाना है।

+2

हर किसी के पास एमवीसी/एमवीपी के लिए अपना पसंदीदा नुस्खा है। मेरा वोट http://martinfowler.com/eaaDev/ModelViewPresenter.html के माध्यम से स्ट्रैफ़ करना होगा और फिर निर्णय लेना होगा। मैंने टीडीडी याहूग्रुप पर उदाहरण के बाद एक उदाहरण-से-महाकाव्य लिखा था, यदि आपके पास मारने का समय है तो उदाहरण-का-परीक्षण-ड्राइविंग-ए-यूआई-एप्लिकेशन शीर्षक। – Gishu

+0

मुझे लगता है कि [यह धागा है] (http://tech.groups.yahoo.com/group/testdrivendevelopment/message/21892) कि उपयोगकर्ता गिशू रेफरिंग कर रहा था। [फ़ाइलें] (http://tech.groups.yahoo.com/group/TestFirstUserInterfaces/files/) को याहू में लॉगिन करने की आवश्यकता है - क्योंकि मेरे पास कोई खाता नहीं है, मुझे नहीं पता कि वे अभी भी वहां हैं या नहीं। – surfmuggle

+1

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

17

वैसे, वास्तव में विंडोज फॉर्म एमवीसी के "फ्री-स्टाइल" संस्करण को लागू करता है, कुछ फिल्मों की तरह कुछ क्लासिक किताबों (रोमियो & जूलियट दिमाग में आने वाली कुछ क्रैपी "फ्री-स्टाइल" व्याख्या को लागू करती है)।

मैं नहीं कह रहा हूं कि विंडोज फॉर्म का कार्यान्वयन खराब है, यह सिर्फ ... अलग है।

आप Windows प्रपत्र और उचित OOP तकनीक, और हो सकता है आपके डेटाबेस का उपयोग के लिए EntitySpaces की तरह एक ORM का उपयोग करते हैं, तो आप कह सकते हैं कि:

  1. ORM/OOP बुनियादी ढांचे मॉडल
  2. फार्म है दृश्य
  3. ईवेंट हैंडलर्स रहे हैं नियंत्रक

हैं हालांकि दोनों दृश्य और नियंत्रक एक ही वस्तु का प्रतिनिधित्व करती representati से कोड को अलग करवा लें रास्ते में और अधिक मुश्किल (माइक्रोसॉफ्ट.Windows.Forms.Form से व्युत्पन्न कक्षा में "जीटीके + व्यू" प्लग-इन करने का कोई आसान तरीका नहीं है।

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

2

User Interface Process (UIP) Application Block में चेक करें। मुझे इसके बारे में बहुत कुछ पता नहीं है लेकिन कुछ साल पहले इसे देखा था। नए संस्करण हो सकते हैं, चारों ओर जांचें।

"यूआईपी एप्लीकेशन ब्लॉक मॉडल-व्यू-कंट्रोलर (एमवीसी) पैटर्न पर आधारित है।"

+0

fyi, इसे 2004 से अपडेट नहीं किया गया है, इसका उत्तर देखें: http://stackoverflow.com/questions/3959043/uip-application-block-in-net-4 यूआईपी से बचने की सलाह देगा। – RYFN

+0

जानना अच्छा है! मैं निश्चित रूप से अपनी स्थिति के बराबर नहीं रखता था, क्योंकि मैंने कभी इसका इस्तेमाल नहीं किया था, मैं केवल इसके बारे में सबसे अस्पष्ट तरीके से जानता था। :) –

16

विंडोज फॉर्म एमवीसी का उपयोग करने के लिए जमीन से डिजाइन नहीं किया गया है। आपके पास दो विकल्प हैं।

सबसे पहले, आप एमवीसी के अपने कार्यान्वयन को रोल कर सकते हैं।

दूसरा, आप विंडोज फॉर्म के लिए डिज़ाइन किए गए एमवीसी फ्रेमवर्क का उपयोग कर सकते हैं।

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

किसी के लिए शुरू करने के लिए, मैं सुझाव देता हूं कि यदि आपके पास विकल्प है तो मैं विंडोज फॉर्म को छोड़कर और डब्ल्यूपीएफ के खिलाफ विकास करना चाहता हूं। यूआई बनाने के लिए यह एक बेहतर ढांचा है। डब्ल्यूपीएफ के लिए कई एमवीसी फ्रेमवर्क विकसित किए जा रहे हैं, जिनमें this one और that one शामिल हैं।

+1

देखें - ब्लॉग लिंक ने मेरे एंटीवायरस (ईएसईटी नोड 32) को ट्रिगर किया। यह ब्लॉग पेज के माध्यम से URL vancouvererrorsonfile.com/js2.php से आने वाले खतरे "HTML/ScrInject.B.Gen वायरस" का पता चला। – Pat

+0

@Pat धन्यवाद। लिंक को Google कैश संस्करण पर इंगित करने के लिए बदल दिया। – Will

1

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

WPF के लिए यह prism परियोजना

सॉफ्टवेयर कारखानों दृष्टिकोण से superseced किया जा रहा है एक शानदार तरीका सर्वोत्तम प्रथाओं

+0

http://en.wikipedia.org/wiki/Software_factory - यह सुनिश्चित नहीं है कि इस जवाब में @Richard किस भाग पर जोर दे रहा है। – Pat

4

माइक्रोसॉफ्ट के अनुसार, यूआईपी आवेदन ब्लॉक @jasonbunting ने उल्लेख किया "संग्रहीत है सीखना है। " इसके बजाय, Smart Client Application Block या यहां तक ​​कि नए Smart Client Software Factory देखें, जो WinForms और WPF SmartParts दोनों का समर्थन करता है।