2011-10-02 13 views
5

Comencé a guiarme por todo el patrón MVP ya pesar de que me está yendo bien con los objetos individuales, se empieza a poner difícil cuando se trata de colecciones.Diferencias de implementación entre MVP Passive View y Supervisoring Controller para colecciones

Digamos que estamos diseñando una aplicación WinForms simple que consiste en un DataGrid dentro de un Formulario, con el Modelo de datos como una simple colección de cosas, donde ese tipo de cosas tiene un montón de propiedades y la Vista va en realidad mostrarlos:

Modelo

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

Ver

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

Presentador

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

Entonces, ¿qué debería implementar al List<People> ListOfPeople captador de vista, así como cómo debería invocar Presentador de UpdateView()?

Y, en general, que los métodos del presentador adicionales sería interesante tener a fin de lograr el MVP pasiva Ver y Supervisar controlador, respectivamente?

Cualquier consejo, revisión u opinión del estilo del código será sinceramente agradecido. Muchas gracias de antemano.

Respuesta

6

En primer lugar, usted debe decidir por un patrón:

  • Controlador Supervisor es adecuada si se quiere aprovechar el enlace de datos y si una herramienta para pruebas de visión automatizados está disponible
  • Passive View está indicada si los datos de la vista se vuelve más complejo o si tiene que depender de las pruebas unitarias puros para la visión completa
  • Presentación Modelo (también conocido como Modelo vista modelo de vista) es ideal si necesita un fácil acceso al estado de la vista completa y si tiene código de generación disponible

he recogido all aspects as well as links to useful considerations and examples.

En cualquier caso, debe definir un PeopleModel y dejar PeopleViewImplementation referencia PeopleModel.Esto claramente separa el modelo de la vista.

Cuando se trata de colecciones, el Controlador Supervisor puede confiar en el enlace de datos de una lista al DataGridView. Ver winForms + DataGridView binding to a List. Solo la vista pasiva y el modelo de presentación requieren un código adicional para asignar la lista a los campos de vista, respectivamente, al modelo de presentación.

En segundo lugar, debe aclararse la asignación de datos: ¿Debería PeopleView mostrar una lista de personas o una lista de varios pueblos? El DataGridView puede mostrar una persona por fila o una persona por fila. Si una persona está representada por fila, el tratamiento de las personas que se podría lograr en una de las siguientes maneras, por ejemplo:

  • Mostrar todas las personas de un pueblo en una página y añadir un elemento localizador para navegar entre diferentes Pueblos
  • Mostrar todas las personas de una persona en la cuadrícula de datos y agregar un widget de selección para las personas, por ejemplo un árbol con todos los pueblos
  • Mix personas de diferentes pueblos de la cuadrícula de datos y añadir una columna para ver el pueblo de cada persona
2

Mi sugerencia es tener un ViewModel para esa colección. La implementación de la vista tendrá la responsabilidad de crear nuevas instancias y actualizar antiguas, pero no tocará nada de su modelo real. Para recuperarlos, simplemente itere las filas y cree una nueva. Finalmente, el presentador repetirá esa colección y creará/actualizará cada miembro de su modelo. (También sugiero usar IEnumerable <> y usar return return para que la colección se itere solo una vez).

Para mostrar los datos, también puede usar este ViewModel (para que sea consistente) o simplemente usar el modelo real (de manera solo lectura) si son diferentes por alguna razón (tal vez muestre más información que la que poder editar).

Espero que ayude.

+1

Sí, actualmente estoy tratando con MVPVM Ver las interfaces pasivas para tratar de animar a TDD , pero al mismo tiempo tiene un ViewModel para manejar DataGridViews. – Heliac

Cuestiones relacionadas