В MVP должен ли View (он же страница) знать что-либо о модели? - PullRequest
3 голосов
/ 21 июня 2011

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

В настоящее время у нас есть расширенный паттерн MVP, в котором мы имеемследующие проекты:

  • Entity (Определяет POCO)
  • Модель (Определяет конфигурации уровня данных (сначала код EF - здесь не важно))
  • Задача (всебизнес-логика в упорядоченной группировке)
  • Спецификатор Presenter (для страницы (или типа страницы), вызывает задачи, определяет и работает со всеми интерфейсами View)
  • View (в форме различных веб-сайтов (внутренняя, внешняя))

В настоящее время в слое View я часто вижу код, который работает непосредственно с сущностями, поэтому страница ASPX (может быть php, что угодно), которая должна отображать список записей, делаетвот так:

public interface IEntityList 
{
    ICollection<Entity> MyEntities {get;set;}
    event EventHandler OnReportRunning;
}

public class EntityList : IEntityList
{
    public ICollection<Entity> MyEntities {get;set;}

    private void RenderEntities()
    {
        OnReportRunning(this, null);
        if (MyEntities != null)
        {
            ArrayList entityList= new ArrayList();
            foreach (var entity in Myentities.OrderBy(e=>e.Field))
            {
                var formatedEntity = new {FullName = String.Format("{0}, {1}", 
                    entity.LastName, entity.FirstName), UserEmail = entity.Email};
                entityList.Add(formatedEntity);
            }
            ddlEntities.DataSource = entityList;
            ddlEntities.DataBind();
        }
    }    
}

Я считаю, что это нарушает намерение уровня презентатора.Я думаю, что представление должно отображать DropDownList (ddlEntities) или любые другие элементы управления, которые оно имеет, и презентатор должен быть точкой, в которой останавливается ВСЕ знание слоя Entity.

И, таким образом, мой вопрос - СЛЕДУЕТСлой View (V) архитектуры MVP (возможно, это MPV) имеет любое знание модели (M)?Или я прав, полагая, что единственная работа, которую должен выполнять слой View, - это прямая реакция на события со стороны элементов управления, и что вся реальная презентационная работа (связывание, форматирование с использованием сущностей и т. Д.) Должна выполняться на уровне презентатора, и чтоПредполагается, что уровень докладчика должен быть в курсе фактического уровня просмотра (IIS против Apache против Mobile и т. Д.)?

1 Ответ

4 голосов
/ 22 июня 2011

Что вы предлагаете с «единственными событиями» в представлении, это Пассивное представление разновидность MVP , я предпочитаю Контролирующий контроллер , где вы сделать все, кроме привязки данных в презентере. У меня обычно есть что-то вроде view.BindData(), в котором представление запрашивает у докладчика данные и связывает их (но, конечно, презентатор контролирует, когда будет вызван BindData(), поэтому он гарантирует, что есть какие-то данные для привязки до вызова ).

Я также считаю, что передача сообщений о событиях вместо непосредственного вызова методов презентатора является излишним в 95% случаев.

...