Это действительная реализация шаблона MVP - PullRequest
2 голосов
/ 24 января 2012

Я пытаюсь проанализировать некоторый код, который был разработан с использованием подхода MVP. Никаких конкретных MVP Framework не использовалось. Это весь рукописный код.

//Interface Representing our View
public interface IFooView
{
   string SomeScreenValue
}

//Presenter Implementation
public class FooPresenter 
{
    private readonly IFooView _view;

    public FooPresenter (IFooView view) 
    {
        //The presenter gets instantiated with a reference to a view.
        _view = view
    }

    public void SomeButton_Click(object sender, EventArgs e)
    {
        _view.SomeScreenValue = "The Result";
    }
}

//The Page Implementation
public class FooPage : System.Web.UI.Page, IFooView
{
    private FooPresenter _presenter;

    protected void Page_Init(...)
    {
        _presenter = new FooPresenter(this);  
        //<-- The View has a Presenter, which references the same View...
        Button1.Click += new EventHandler(_presener.SomeButton_Click);
    }
}

Это работает в том смысле, что позволяет разработчику переместить бизнес-логику из кода в классы, но при этом воздействовать на представление. Но отсутствие реальной Модели и то, как настроены отношения View => Presenter => View, немного утомительно для меня?

Так является ли вышеуказанная ситуация допустимой реализацией шаблона MVP?

Ответы [ 3 ]

4 голосов
/ 24 января 2012

Это почти MVP в том смысле, что ваш Presenter отсоединен от представления таким образом, что при обновлении состояния пользовательского интерфейса он делает это через интерфейс IFooView.Однако наличие в презентаторе метода, соответствующего стандартному обработчику событий .NET, мне кажется неправильным.Я бы заставил IFooView вызвать событие, когда происходит нажатие кнопки, тогда ваша страница может выполнить задачу обработки нажатия кнопки, как вы это делаете в настоящее время, а затем вызвать событие, которое обрабатывает ваш Presenter.Это событие может быть более тесно связано с доменом, например, вы можете захотеть, чтобы такое событие, как RecordUpdated, было выставлено через IFooView.

. Это упростит предоставление фиктивной реализации IFooView.для модульного тестирования, что, в конце концов, является большим преимуществом использования шаблона MVP / MVC / MVVM.

Если у вас нет данных, поступающих от серверной службы или базы данных, то в случаепростые приложения - это нормально, что выступающий также берет на себя роль модели.Это случай в вашем тривиальном примере.То же самое можно сделать в MVVM, где ViewModel также может взять на себя обязанности модели.Тем не менее, я бы порекомендовал создать модель, если вы делаете что-то нетривиальное.В вашем случае докладчик делегировал бы Модель для поддержания состояния и использовал бы своего рода «службу» для сохранения изменений в этой модели или извлечения объектов модели из веб-служб.

2 голосов
/ 24 января 2012

Да, это так.

Но ... Вместо этого я должен изменить конструкцию презентатора на конструктор FooPage. Иногда вы хотите обработать событие preInit, и это невозможно с этой настройкой.

1 голос
/ 27 января 2012

Да, это вариант пассивного просмотра презентатора моделей. В этом варианте представление вообще ничего не знает о представлении. Вид тупой и полностью контролируется докладчиком.

Шаблон MVP был описан Фаулером в 2004 году, и он удалил его в 2006 году , разбив образец на контролирующий контроллер (sc) и Passive View ( ру). В sc вид привязан к модели, а в pv нет, в pv вид меняется только непосредственно ведущим.

...