Создает ли Presenter в Model-View-Presenter представления? - PullRequest
30 голосов
/ 06 июня 2011

Как представления создаются в MVP? Всегда ли их создает докладчик (в дополнение к просмотру в случае подпредставлений)? Или это отдельный сторонний компонент или приложение или что-то, что их создает?

Давайте также добавим, что я, вероятно, собираюсь сделать это с помощью Dojo Toolkit / ExtJS (то есть JavaScript).

Итак, у меня есть следующие строки кода:

var v = new MyApp.view.User();
var p = new MyApp.presenter.User();

где обе строки должны идти точно? Ведущий создает экземпляр представления или наоборот? А что создает первый экземпляр?

Ответы [ 5 ]

46 голосов
/ 21 июня 2011

Это зависит ...

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

Шаблон MVP был описан Фаулером в 2004 году, и он удалил его в 2006 году , разбив образец на Контролирующий контроллер (SC) и Пассивное представление ( PV). В SC вид связан с моделью, но не в PV; в PV вид изменяется только непосредственно докладчиком.

И в SC, и в PV докладчик должен обновлять представление и реагируют на изменения, вносимые пользователем в представление, такие как ввод текста или нажатие кнопки. Когда вы разрешаете методы вызова View на Presenter, возникает проблема, которую вы описываете, потому что View нуждается в ссылке на Presenter и наоборот. Если вы сделаете это, , вы просто сможете принять решение, кто запустит все это . Варианты:

  1. Представление создает экземпляр Presenter. Когда представление загружено, оно передает себя Presenter в функции инициализации Presenter.
  2. С другой стороны: Presenter создает представление и передает его представлению в функции инициализации в представлении.
  3. Вы вводите третий объект, который создает и View, и Presenter, соединяет их вместе и инициализирует их обоих.

Все опции позволяют вам достичь «целей MVP» разделения интересов и повышенной проверяемости логики принятия решений. Я не думаю, что какой-либо из этих методов является теоретически правильным или неправильным - вам просто нужно выбрать тот, который наиболее соответствует технологии, которую вы используете. И лучше всего быть последовательным в своем выборе на протяжении всего приложения.

6 голосов
/ 20 мая 2012

Это ваши параметры:

var cvp = new ContactViewPresenter(new ContactView());

ContactViewPresenter конструкторы this.view = viewParam и this.view.presenter = this.Он хранит код в Presenter, может при необходимости менять представления и может передавать макет представления для тестирования.

var cv = new ContactView(new ContactViewPresenter());

ContactView конструкторов this.presenter = cvpParam и this.presenter.view = this.Некоторая логика в View, но не много.Может заменить докладчика, если это необходимо.

ContactView cv = new ContactView();
ContactViewPresenter cvp = new ContactViewPresenter();
cv.presenter = cvp;
cvp.view = cv;
cv.init();
cvp.init();

Это намного больше кода.

ContactViewPresenter cvp = new ContactViewPresenter();

Конструктор создает наборы this.view = new ContactView() и this.view.presenter = this.

ContactView cv = new ContactView();

Наборы конструкторов this.presenter = new ContactViewPresenter()и this.presenter.view = this

Последние два кажутся слишком связанными.

Приятно, что код остается в Presenter и, по-видимому, облегчает тестирование.

Два приятен тем, что вам не нужно слишком заботиться о Presenters иможет больше беспокоиться о ваших представлениях.

2 голосов
/ 20 июня 2011

Я не думаю, что докладчик должен создавать представление, которое должно быть сделано сущностью (не в ориентированном на данные смысле, я имею в виду общую сущность) вне триады MVP.Например, инфраструктура Inversion of Control (IoC) (если вы еще не слышали о IoC, проверьте статья Мартина Фаулера ), или какой-то модуль приложения, отвечающий за настройку пользователя.

0 голосов
/ 21 июня 2011

Возможно, у меня немного неправильная терминология, но я думаю, что вам нужно определить корень композиции вашего взаимодействия;с чего начинается взаимодействие?

В приведенном мной примере веб-формы веб-форма создается конвейером Http, а событие OnInit или OnLoad является первой точкой в ​​конвейере (в зависимости от того, какой контекст вам нужен).) что вы можете «подключиться» к процессу.Таким образом, вы создаете Presenter и даете ему конкретный экземпляр веб-формы в качестве интерфейса представления.

Я не знаю, какие Javascript-структуры вы обсуждаете, но я предполагаю, что в ASP есть шаг инициализации / вызова -.NET MVC, когда в игру вступает ActionInvoker, это главное в консольном приложении.

0 голосов
/ 06 июня 2011

Если вы используете WebForms, то WebForm OnLoad или Init должны быть тем местом, где вы создаете Presenter - тогда ему передается интерфейсная ссылка на View, который реализует WebForm.

Итак, что-то вроде этого:

Presenter _presenter;

OnLoad(object sender, EventArgs e) 
{
  _presenter = new Presenter(this);
  _presenter.Initialise();
}

И конструктор Presenter определяется следующим образом:

public class Presenter
{
  public Presenter(IView viewReference)
  {
    _viewReference = viewReference;
  }
}
...