2009-03-17 19 views
99

के साथ एमवीसी लागू करना विंडोज फॉर्म में एमवीसी पैटर्न को पूरी तरह से कार्यान्वित करने के तरीके पर मुझे एक अच्छा उदाहरण कहां मिल सकता है?विंडोज फॉर्म

मुझे विभिन्न साइटों पर कई ट्यूटोरियल और कोड उदाहरण मिले (उदाहरण के लिए, The Code Project और .NetHeaven), लेकिन कई एमवीसी की तुलना में पर्यवेक्षक पैटर्न के लिए अधिक प्रतिनिधि हैं। चूंकि मैं विकसित करना चाहता हूं, एक स्कूल प्रोजेक्ट के लिए, मैं PureMVC या MVC# जैसे ढांचे का उपयोग करने में अनिच्छुक हूं।

+1

के संभावित डुप्लिकेट [? आप कैसे एक WindowsForms आवेदन में MVC लागू करेगा] (http://stackoverflow.com/questions/ 122388/कैसे-करेंगे-आप-कार्यान्वयन-एमवीसी-इन-ए-विंडोज़फॉर्म-एप्लिकेशन) – nawfal

+1

यह भी देखें [डाटाबेसिंग प्रकार को सुरक्षित कैसे करें और रीफैक्टरिंग का समर्थन कैसे करें] (http://stackoverflow.com/questions/1329138/how-to -मेक-डाटाबेसिंग-टाइप-सेफ-एंड-सपोर्ट-रिफैक्टरिंग) –

उत्तर

109

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

  • सीधे डेटाबेस से बात (2 स्तरीय) एक बैकएंड कि दिए गए आवेदन (3 टीयर)
  • लिए लिखा गया है
  • उपयोग
  • कई सेवाओं द्वारा उपयोग के लिए लिखी गई वेब सेवाओं का एक सेट उपयोग करें और आपके आवेदन के लिए बदला नहीं जा सकता है। (सेवा-उन्मुख संरचना)
  • अपडेट CRUD आपरेशन द्वारा किया जा रहा
  • अपडेट command pattern (बैकएंड सर्वर को भेजने से आदेशों)
  • data binding/आंकड़ों का कोई उपयोगों के उपयोगों के बहुत से
  • अधिकांश डेटा बाइंडिंग के साथ किया जा रहा है "टेबल जैसी" (जैसे चालान) होने के नाते जो मानक ग्रिड नियंत्रणों में अच्छी तरह से काम करते हैं/अधिकांश यूआई डेटा के लिए कस्टम नियंत्रण की आवश्यकता होती है।
  • एक डेवलपर/10 या 20 डेवलपर्स (बस यूआई पर) mocks आदि का उपयोग इकाई परीक्षण के
  • बहुत सारे की टीमों/कोई इकाई परीक्षण

इसलिए मैं इसे एक कार्यान्वयन के लिए संभव है नहीं लगता है एमवीसी (या एमवीपी) जो हमेशा अच्छी तरह से फिट बैठता है।

सबसे अच्छा पदों मैं वास्तव में देखा है MVC और क्यों एक MVC प्रणाली जिस तरह से यह है बनाया गया है समझा, "Build Your Own CAB" series by Jeremy D Miller है। काम करने के बाद भी आपको अपने विकल्पों को बहुत बेहतर समझने में सक्षम होना चाहिए। Microsoft's Smart Client Guidance (CAB/Microsoft Composite Application Block) पर भी विचार किया जाना चाहिए। यह थोड़ा जटिल है, लेकिन यह उन अनुप्रयोगों के लिए अच्छी तरह से काम कर सकता है जिनके पास एक अच्छा फिट है।

MVC/MVP Implementation for a Winforms Project का चयन करना एक सिंहावलोकन देता है जो पढ़ने योग्य है। PureMVC जैसे बहुत से लोग। मैंने कभी इसका इस्तेमाल नहीं किया है, लेकिन अगली बार जब मुझे एमवीसी ढांचे की आवश्यकता होगी तो मैं इसे देखता हूं।

"Presenter First" एक सॉफ्टवेयर विकास दृष्टिकोण है जो मॉडल व्यू प्रेजेंटर (एमवीपी) डिज़ाइन पैटर्न और test-driven development के विचारों को जोड़ता है। यह आपको ग्राहक की भाषा में परीक्षण लिखकर शुरू करने देता है। उदाहरण के लिए:

"जब मैं क्लिक करें 'सहेजें' बटन तो फ़ाइल बचाया जाना चाहिए और न सहेजा गया फ़ाइल चेतावनी गायब करना चाहिए।"

मैं का उपयोग कर "प्रस्तुतकर्ता पहले कोई अनुभव नहीं है , "लेकिन मैं इसे एक कोशिश जब मैं एक मौका मिलता है दे देंगे, के रूप में यह बहुत आशाजनक दिखता है।

अन्य ढेर   ओवरफ्लो प्रश्न देखने के लिए पर here और here हैं चाहते हो सकता है हो सकता है।

यदि आप किसी भी समय WPF का उपयोग करने की सोच रहे हैं तो Model-View ViewModel (MVVM) पैटर्न पर एक नज़र डालें। यहां एक बहुत अच्छा वीडियो है जिसे आपको देखना चाहिए: Jason Dolinger on Model-View-ViewModel

MVVM (Model View View Model) Design Pattern for Winforms एक और विकल्प दें जो कभी भी आवश्यक होने पर WPF में परिवर्तित करना आसान हो सकता है। Magical.Trevor विंडोज फॉर्म के लिए अभी तक एक और एमवीवीएम नमूना है जिसमें संपत्ति नामों के आधार पर ऑटो बाध्यकारी भी शामिल है।


भी अपने आप को पूछना क्यों आप MVC का उपयोग कर रहे हैं।

  • क्या आप जितना संभव हो उतना कोड परीक्षण करने में सक्षम होना चाहते हैं?
  • क्या आप जितना संभव हो सके कोड को पुन: उपयोग करने की अनुमति दे रहे हैं?
  • क्या आप अपना कोड बेस समझने में आसान बना रहे हैं?
  • 101 अन्य कारण जो किसी दिए गए प्रोजेक्ट के लिए मान्य हो सकते हैं।

एक बार जब आप पर अपने करना स्पष्ट हैं, यह एक कार्यान्वयन या किसी अन्य का चयन करने के आसान हो जाता है।

+0

यह "सीएबी" क्या है? –

+0

@AgnelKurian, सीएबी माइक्रोसॉफ्ट से एप्स बनाने के तरीके पर नमूना कोड का एक सेट था - अब यह ज्यादातर इतिहास है। –

+0

हाहा! हां, मुझे अब उन "एप्लिकेशन ब्लॉक" याद हैं। –

6

क्या आपने PureMVC पर देखा है? मैंने पाया है कि कोई भी इस बात पर सहमत नहीं हो सकता कि एमवीसी वास्तव में एक विशिष्ट कार्यान्वयन शुरू करने के बाद कैसा दिखता है।

अपडेट: आप MobileMVC जैसे कुछ आसान के साथ अपना स्वयं का निर्माण कर सकते हैं। कॉम्पैक्ट फ्रेमवर्क कोड को विंडोज़ पर ठीक/संकलित करना चाहिए। चूंकि यह एक स्कूल असाइनमेंट है, इसलिए मैं सुझाव दूंगा कि आप वास्तव में कुछ समय बिताते हैं कि एमवीसी वास्तव में कैसे काम करता है।

+0

मेरे पास बुकस्टोर का प्रबंधन करने के लिए एक बहुत ही सरल एप्लिकेशन के लिए स्कूल असाइनमेंट है, और मैं PureMVC जैसे ढांचे का उपयोग करने में काफी अनिच्छुक हूं। मैं कुछ आसान खोज रहा हूँ। – kjv

3

आप Differential Execution पर एक नज़र डालना चाहते हैं।

यहाँ यह SourceForge

IMO में, यह MVC पर एक विशाल सुधार है, हालांकि यह अभी भी काफी असामान्य है।

2

विंडोज फॉर्म का उपयोग कर एमवीसी के अपने कार्यान्वयन को रोल करने में एक अच्छा उदाहरण here पाया जा सकता है। स्रोत कोड शामिल है।

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

जब आप स्कूल से बाहर हों तो शायद आप अन्य पोस्टर्स की सिफारिश की तरह ढांचे पर वापस आना चाहेंगे।

2

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

यदि आप एक बहुत पूर्ण (और किसी भी तरह जटिल) एमवीपी कार्यान्वयन के कोड की जांच करने के इच्छुक हैं, तो आप एमएस-सीएबी को माइक्रोसॉफ्ट स्मार्ट क्लाइंट सॉफ्टवेयर फैक्टरी के घटकों में से एक के रूप में पा सकते हैं। यह स्रोत कोड के साथ आता है। आप इसे here पा सकते हैं। सौभाग्य!

43

अद्यतन: नीचे अपने पिछले जवाब के अलावा, मैं "Presenter First" approach (विशेष रूप से पीडीएफ लेख) के बारे में (PassiveView पैटर्न वास्तव में) MVC के बजाय पढ़ने का सुझाव

मैं एमवीपी की सिफारिश करेंगे। इसके लिए आपको वास्तव में किसी विशेष ढांचे की आवश्यकता नहीं है, यह सिर्फ आपके कोड को व्यवस्थित करने का तरीका है।

एक दृष्टिकोण (जो मैं आमतौर पर लेने के लिए) विभाजित करने के लिए प्रत्येक खिड़कियों तीन संस्थाओं में फार्म है:

  1. एक प्रस्तोता/नियंत्रक वर्ग - यह है कि क्या आप वास्तव में जब एक रूप को विकसित करने के साथ शुरू होता है। यह वह जगह है जहां आपके अधिकांश "व्यवसाय" तर्क का निवास होना चाहिए।
  2. एक दृश्य इंटरफ़ेस (IView), जिसमें विधियों, गुणों और घटनाएं शामिल हैं। यह इंटरफ़ेस सभी है जो प्रस्तुतकर्ता आपके फ़ॉर्म के बारे में जानता है।
  3. अंत में, जब आप प्रस्तुतकर्ता और दृश्य (यूनिट परीक्षण सहित) को कार्यान्वित करना समाप्त करते हैं, तो आप वास्तविक फॉर्म क्लास बना सकते हैं और इसे IView इंटरफ़ेस को कार्यान्वित कर सकते हैं। फिर यह फ़ॉर्म में उचित नियंत्रण जोड़ने और उन्हें इंटरफ़ेस में तारों का एक प्रश्न है।

उदाहरण कोड (एक सरल स्यूडोकोड, बस उदाहरण के लिए):

interface IView 
{ 
    string Username { get; set; } 
    string Password { get; set; } 

    event EventHandler LogOnButtonClicked; 

    void InformUserLogOnFailed(); 
    void MoveToMainScreen(); 
} 

class Presenter 
{ 
    public Presenter(IView view) 
    { 
     this.view = view; 
     view.LogOnButtonClicked += new EventHandler(OnLogOnButton); 
    } 

    private void OnLogOnButton() 
    { 
     // we ask some service to verify the username/password 
     bool isLogOnOk = logOnService.IsUserAndPasswordOk(view.Username, view.Password); 
     if (isLogOnOk) 
      view.MoveToMainScreen(); 
     else 
     { 
      view.Username = ""; 
      view.Password = ""; 
      view.InformUserLogOnFailed(); 
     } 
    } 

    private IView view; 
} 

class Form : IView 
{ 
    public Form() 
    { 
     presenter = new Presenter(this); 
    } 

    public string Username 
    { 
     get { return TextBoxUsername.Text; } 
     set { TextBoxUsername.Text = value; } 
    } 

    public string Password 
    { 
     get { return TextBoxPassword.Text; } 
     set { TextBoxPassword.Text = value; } 
    } 

    public void InformUserLogOnFailed() 
    { 
     MessageBox.Show("Invalid username or password."); 
    } 

    public void MoveToMainScreen() 
    { 
     // code for opening another form... 
    } 

    private Presenter presenter; 
} 
+7

यह एमवीपी संस्करण का एक कार्यान्वयन है जिसे PassiveView कहा जाता है। निष्क्रिय दृश्य में दृश्य को अपने प्रस्तुतकर्ता को पसंद नहीं करना चाहिए। इसी तरह के उदाहरण के लिए (लेकिन एक दृश्य के साथ वास्तव में निष्क्रिय) इस नमूना की जांच करें http://www.danieleteti.it/?p=221 (डेल्फी भाषा में उदाहरण) –

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