Различия в реализации между MVP Passive View и Supervising Controller для коллекций - PullRequest
5 голосов
/ 03 октября 2011

Я начал оборачивать голову вокруг всего шаблона MVP , и, несмотря на то, что у меня все хорошо с отдельными объектами, становится трудно, когда дело касается коллекций.

Так что давайтеДопустим, мы проектируем простое приложение WinForms, которое состоит из DataGrid в Форме, а Модель данных представляет собой простой набор элементов, в которых такие элементы имеют множество свойств, и View фактически отображает их:

Модель

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 получателе View, а также как я должен вызывать Presenter's UpdateView()?

И вообще, какие дополнительные методы Presenter было бы интересно иметь для достижения MVP Пассивное представление и Контролирующий контроллер соответственно?

Любые советы, обзоры стилей кода или мнения будут искренне оценены.Большое спасибо заранее.

Ответы [ 2 ]

6 голосов
/ 18 января 2012

Прежде всего, вы должны выбрать один шаблон:

  • Supervising Controller подходит, если вы хотите использовать привязку данных и если доступен инструмент для автоматических тестов представления
  • Пассивное представление отображается, если данные вашего представления становятся более сложными или если для полного просмотра вам необходимо полагаться на чисто модульные тесты
  • Модель представления (также известная как модель представления ViewModel) идеально подходит, если вам нужен легкий доступ к полному состоянию представления и если у вас есть доступная генерация кода

Я собрал все аспекты, а также ссылки на полезные соображения и примеры .

В любом случае вы должны определить PeopleModel и позволить PeopleViewImplementation reference PeopleModel. Это четко отделяет модель от вида.

Когда дело касается коллекций, Supervising Controller может рассчитывать на привязку данных списка к DataGridView. См. winForms + DataGridView привязки к списку . Только для пассивного представления и модели презентации требуется дополнительный код для сопоставления списка с полями представления соответственно с моделью представления.

Во-вторых, необходимо уточнить отображение данных: должен ли PeopleView показывать список людей или список нескольких народов? DataGridView может отображать одного человека в ряду или одного человека в ряду. Если в строке отображается один человек, лечение людей может быть достигнуто одним из следующих способов, например:

  • Показать всех людей одного человека на одной странице и добавить элемент пейджера для навигации между разными людьми
  • Показать всех людей одного человека в сетке данных и добавить виджет выбора для людей, например, дерево со всеми народами
  • Смешайте людей разных народов в сетке данных и добавьте столбец для отображения людей каждого человека
2 голосов
/ 23 декабря 2011

Я предлагаю иметь ViewModel для этой коллекции. Реализация представления будет отвечать за создание новых экземпляров и обновление старых, но это не затронет ничего из вашей реальной модели. Чтобы получить их, просто переберите строки и создайте новый. Наконец, докладчик будет повторять эту коллекцию и создавать / обновлять каждого члена вашей модели. (Я также предлагаю использовать IEnumerable <> и использовать yield return, чтобы коллекция повторялась только один раз).

Для отображения данных вы также можете использовать эту ViewModel (чтобы она была согласованной) или просто использовать фактическую модель (только для чтения), если они по какой-то причине отличаются (возможно, вы показываете больше информации, чем вы можете редактировать).

Надеюсь, это поможет.

...