在MVP中,View(也就是页面)是否应该了解模型?

时间:2011-06-21 15:44:46

标签: oop design-patterns mvp

在我接触关于重构应用程序主要部分的项目负责人之前,我真的在寻找更多关于我对MVP的理解的验证......

我们目前有一个扩展的MVP模式,我们有以下项目:

  • 实体(定义POCO)
  • 模型(定义数据层配置(首先是EF代码 - 这里不重要))
  • 任务(有序分组中的所有业务逻辑)
  • Presenter(特定页面(或页面类型),调用任务,定义并使用所有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)或其他任何控件,并且演示者应该是实体层的所有知识停止的点。

因此我的问题 - 应该是MVP的View(V)层(也许应该是MPV)架构有模型(M)的任何知识?或者我认为View层应该做的唯一工作是对控件中的事件的直接反应,以及所有真正的表示工作(绑定,格式化涉及实体等)应该在presenter层中完成,并且支持Presenter层以强烈了解实际的View层(IIS与Apache与Mobile等)?

1 个答案:

答案 0 :(得分:4)

您对该视图中“仅限事件”的建议是Passive View MVP的味道,我更喜欢Supervising Controller,除了数据绑定之外,您还可以执行所有操作主持人。我通常有类似view.BindData()的东西,其中视图要求演示者提供数据并绑定它(但当然,演示者控制何时调用BindData(),因此它确保在绑定之前有一些数据要绑定打电话。)

我还认为事件通信而不是直接调用presenter方法在95%的情况下都是过度杀伤。