2011-10-02 11 views
5

मैंने अपने सिर को पूरे एमवीपी पैटर्न के चारों ओर लपेटना शुरू कर दिया है और बावजूद मैं एकल वस्तुओं के साथ ठीक कर रहा हूं, जब संग्रहों की बात आती है तो मुश्किल हो रही है।संग्रह के लिए एमवीपी निष्क्रिय दृश्य और पर्यवेक्षण नियंत्रक के बीच कार्यान्वयन अंतर

तो मान लीजिए कि हम एक साधारण WinForms एप्लिकेशन को आर्किटेक्ट कर रहे हैं जिसमें एक फॉर्म के भीतर डेटाग्रिड होता है, जिसमें डेटा मॉडल का एक साधारण संग्रह होता है, जहां ऐसी सामग्री में गुणों का समूह होता है और दृश्य वास्तव में जा रहा है उन्हें प्रदर्शित:

मॉडल

public class Person 
{ 
    public string Name { get; set; } 
    public DateTime Birth { get; set; } 
    public bool IsCool { get; set; } 
} 

public class People 
{ 
    public List<Person> Persons { get; set; } 
} 

देखें

public interface IPeopleView 
{ 
    List<People> ListOfPeople { get; set; } 
} 

public partial class PeopleViewImpl : Form, IPeopleView 
{ 
    private DataGridView _grid = new DataGridView(); 

    public PeopleViewImpl() 
    { 
     InitializeComponent(); 
    } 

    // Implementation of IPeopleView 
    public List<People> ListOfPeople 
    { 
     get { return /* TODO */; } 
     set { _grid.DataSource = value; } 
    } 
} 

प्रस्तुतकर्ता

public class PeoplePresenter 
{ 
    private People _model; 
    private IPeopleView _view; 

    public PeoplePresenter(People model, IPeopleView view) 
    { 
     _model = model; 
     _view = view; 
    } 

    void UpdateView() 
    { 
     _view.ListOfPeople = _model.Peoples; 
    } 
} 

तो क्या मैं दृश्य के List<People> ListOfPeople गेटर के साथ-साथ मैं कैसे आह्वान चाहिए प्रस्तुतकर्ता UpdateView() को लागू करना चाहिए?

और आम तौर पर, जो अतिरिक्त प्रस्तुतकर्ता तरीकों आदेश और क्रमशः नियंत्रक निगरानी एमवीपी निष्क्रिय देखें प्राप्त करने के लिए है करने के लिए दिलचस्प हो सकता है?

कोई सलाह, कोड शैली समीक्षा या राय ईमानदारी से सराहना की जाएगी। अग्रिम में बहुत बहुत धन्यवाद।

उत्तर

6

सबसे पहले, आप एक पैटर्न के लिए तय करना चाहिए:

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

मैंने all aspects as well as links to useful considerations and examples एकत्र किया है।

किसी भी मामले में, आपको PeopleModel परिभाषित करना चाहिए और PeopleViewImplementation संदर्भ PeopleModel दें।यह स्पष्ट रूप से मॉडल को दृश्य से अलग करता है।

जब संग्रह की बात आती है, तो पर्यवेक्षण नियंत्रक DataGridView पर किसी सूची के डेटा बाइंडिंग पर भरोसा कर सकता है। winForms + DataGridView binding to a List देखें। केवल निष्क्रिय दृश्य और प्रेजेंटेशन मॉडल को प्रस्तुतिकरण मॉडल में क्रमशः दृश्य फ़ील्ड में सूची मैप करने के लिए अतिरिक्त कोड की आवश्यकता होती है।

दूसरा, डेटा मैपिंग को स्पष्ट किया जाना चाहिए: PeopleView व्यक्तियों की एक सूची या कई लोगों की सूची दिखाएं? DataGridView या तो प्रति पंक्ति एक व्यक्ति या प्रति पंक्ति एक व्यक्ति प्रदर्शित कर सकते हैं। एक पृष्ठ पर

  • दिखाएँ एक लोगों के सभी व्यक्तियों और विभिन्न बीच नेविगेट करने के एक पेजर तत्व जोड़: एक व्यक्ति प्रति पंक्ति प्रदर्शित होता है, लोगों के इलाज के लिए, निम्न तरीकों में से एक में प्राप्त किया जा सकता है, उदाहरण के लिए लोग
  • डेटा ग्रिड में एक व्यक्ति के सभी व्यक्तियों को दिखाएं और लोगों के लिए चयन विजेट जोड़ें, उदाहरण के लिए सभी लोगों के साथ एक पेड़ डेटा ग्रिड में विभिन्न लोगों के
  • मिक्स व्यक्तियों और प्रत्येक व्यक्ति के लोगों को प्रदर्शित करने के लिए एक कॉलम जोड़
2

मेरा सुझाव है कि उस संग्रह के लिए व्यूमोडेल होना है। दृश्य कार्यान्वयन में नए उदाहरण बनाने और पुराने अपडेट करने की ज़िम्मेदारी होगी, लेकिन यह आपके वास्तविक मॉडल के कुछ भी छूएगा। उन्हें पुनर्प्राप्त करने के लिए, पंक्तियों को फिर से बनाएं, एक नया बनाएं। अंत में, प्रस्तुतकर्ता उस संग्रह को पुन: सक्रिय करेगा और आपके मॉडल के प्रत्येक सदस्य को बना/अपडेट करेगा। (मैं आईन्यूमेरेबल <> और उपज रिटर्न का उपयोग करने का भी सुझाव देता हूं ताकि संग्रह केवल एक बार फिर से चालू हो)।

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

उम्मीद है कि यह मदद करता है।

+1

हां, वर्तमान में MVPVM साथ निष्क्रिय देखें इंटरफेस कोशिश करते हैं और TDD प्रोत्साहित करने के लिए कोशिश कर रहा हूँ , लेकिन साथ ही DataGridViews को संभालने के लिए एक ViewModel है। – Heliac

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