在MVP中,View(也就是页面)是否需要了解Model的任何信息?

3

在我向项目负责人提出重构应用程序的主要部分之前,我真的更希望你能验证我对MVP的理解...

目前,我们采用了扩展的MVP模式,其中包含以下项目:

  • 实体(定义POCOs)
  • 模型(定义数据层配置(EF code first - 并不重要))
  • 任务(所有业务逻辑按顺序分组)
  • 主持人(特定于页面(或页面类型),调用任务,定义并与所有视图接口一起使用)
  • 视图(以不同的网站形式呈现(内部,外部))

目前,在视图层中,我经常看到直接与实体相关的代码,因此,像这样显示条目列表的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();
        }
    }    
}

我认为这违反了Presenter层的意图。我认为View应该暴露DropDownList(ddlEntities)或其他控件,Presenter应该是Entity层所有知识停止的地方。
因此我的问题是 - MVP架构中的View(V)层是否应该具有任何对模型(M)的了解?或者我是否正确地认为View层应该只处理来自控件的事件反应,并且所有真正的呈现工作(涉及实体的绑定、格式化等)都应该在Presenter层完成,并且Presenter层应该强烈了解实际的View层(IIS vs. Apache vs Mobile等)?

你只是偏爱一种不同于当前项目中应用的MVP模式。Denis的回答很好地指出了这一点。两种模式都没有对错之分;只要你的团队在整个应用程序中保持一致,就应该没问题。 - Marijn
1个回答

4
您所建议的“只有事件”视图是被动视图风格的MVP,我更喜欢监督控制器,在其中您可以在Presenter中除数据绑定以外完成所有操作。通常我会像这样做:view.BindData(),在其中View请求Presenter的数据并将其绑定(但当然,Presenter控制何时调用BindData(),因此它确保在进行调用之前有一些数据可供绑定)。
我还认为,在95%的情况下,使用事件通信而不是直接调用Presenter方法是过度设计。

我想我表达不够清晰 - 当我说只有事件时,我的意思是 asp 页面仅响应来自其自身控件的事件,然后调用 presenter。话虽如此,您认为 presenter 是否应该知道最终视图?Presenter 应该处理 Web 控件吗?还是允许视图知道实体层? - The Evil Greebo
请注意,“被动视图”可以使用视图上的事件实现或不使用。如果您不使用视图订阅的事件,则必须向视图提供对其Presenter的引用,这在我看来完全没问题。例如,在ASP.NET中可以很好地工作。 - Marijn
我突然意识到,这真的不是适合在 Stack Overflow 上问的问题,是吧... ;) - The Evil Greebo
我们的设计师明确选择了事件模型,以避免让视图意识到Presenter的存在。也许这是有道理的,但要注意,对于大多数应用程序来说,这种情况非常罕见。关于你的问题:Presenter必须意识到View的接口,实际的View通过Presenter构造函数注入。对于View而言也是如此,它取决于Presenter的接口,而不是具体的Presenter。 - Denis Biondic
从视图调用Presenter接口上的方法是完全可以的 - 因为在真正的被动视图中,你有大量公开控制属性等属性的属性 - 我觉得这很繁琐而且不必要。 - Denis Biondic
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接