2011-10-02 11 views
5

Ho iniziato a ragionare su tutto lo schema MVP e nonostante stia andando bene con i singoli oggetti inizia a diventare difficile quando si tratta di collezioni.Differenze di implementazione tra MVP Passive View e Supervising Controller per le raccolte

Quindi diciamo che stiamo architecting un'applicazione semplice WinForms che consiste di un DataGrid all'interno di un modulo, con il modello di dati di essere una semplice raccolta di roba, in cui tale roba ha un sacco di proprietà e la vista sta andando in realtà visualizzarli:

Modello

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; } 
} 

View

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; } 
    } 
} 

Presentatore

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; 
    } 
} 

ma cosa dovrei attuare a di vista List<People> ListOfPeople getter e come dovrei richiamare Presenter di UpdateView()?

E, in generale, che i metodi Presenter supplementare sarebbe interessante avere al fine di ottenere MVP Passive View e Supervisione rispettivamente controller?

Qualsiasi consiglio, recensione in stile codice o parere sarà apprezzato sinceramente. Grazie mille in anticipo.

risposta

6

Prima di tutto, si dovrebbe decidere per un modello:

  • supervisione Controller è appropriata se si vuole sfruttare l'associazione di dati e se uno strumento per i test vista automatizzati è disponibile
  • Passive View è indicato se i tuoi dati di visualizzazione diventano più complessi o se devi affidarti a puri test unitari per la visualizzazione completa
  • Presentation Model (noto anche come ViewModel Model View) è l'ideale se hai bisogno di accedere facilmente allo stato di visualizzazione completo e se hai il codice generazione disponibile

Ho raccolto all aspects as well as links to useful considerations and examples.

In entrambi i casi, è necessario definire un PeopleModel e lasciare PeopleViewImplementation di riferimento PeopleModel.Questo separa chiaramente il modello dalla vista.

Per quanto riguarda le raccolte, il Controllore di supervisione può fare affidamento sull'associazione dati di un elenco allo DataGridView. Vedi winForms + DataGridView binding to a List. Solo la visualizzazione passiva e il modello di presentazione richiedono un codice aggiuntivo per mappare l'elenco ai campi vista rispettivamente al modello di presentazione.

In secondo luogo, la mappatura dei dati deve essere chiarita: dovrebbe PeopleView mostrare un elenco di persone o un elenco di più popoli? Lo DataGridView può visualizzare una persona per riga o un popolo per riga. Se una persona viene visualizzato per riga, il trattamento delle persone che potrebbe essere realizzato in uno dei seguenti modi, per esempio:

  • Mostra tutte le persone di un unico popolo in una sola pagina e aggiungere un elemento di cercapersone per navigare tra le diverse peoples
  • Mostra tutte le persone di una persona nella griglia di dati e aggiungi un widget di selezione per le persone, ad es. un albero con tutti i popoli
  • Mix persone di diversi popoli nella griglia di dati e aggiungere una colonna per visualizzare la gente di ogni persona
2

Il mio suggerimento è di avere un ViewModel per quella raccolta. L'implementazione della vista avrà la responsabilità di creare nuove istanze e aggiornare vecchi, ma non toccherà nulla del tuo modello attuale. Per recuperarli, basta ripetere le righe e creare una nuova. Infine, il presentatore itererà quella raccolta e creerà/aggiornerà ogni membro del tuo modello. (Suggerisco anche di utilizzare IEnumerable <> e di utilizzare yield return così la raccolta viene iterata una sola volta).

Per mostrare i dati, è possibile utilizzare anche questo ViewModel (quindi sarà coerente) o semplicemente utilizzare il modello attuale (in modo readonly) se sono diversi per qualche motivo (forse si mostrano più informazioni di quelle che si può modificare).

Spero che aiuti.

+1

Sì, sto attualmente cercando MVPVM con Vista interfacce passive per cercare e incoraggiare TDD , ma allo stesso tempo ha un ViewModel per gestire DataGridViews. – Heliac

Problemi correlati