在我接触关于重构应用程序主要部分的项目负责人之前,我真的在寻找更多关于我对MVP的理解的验证......
我们目前有一个扩展的MVP模式,我们有以下项目:
目前在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等)?
答案 0 :(得分:4)
您对该视图中“仅限事件”的建议是Passive View MVP的味道,我更喜欢Supervising Controller,除了数据绑定之外,您还可以执行所有操作主持人。我通常有类似view.BindData()
的东西,其中视图要求演示者提供数据并绑定它(但当然,演示者控制何时调用BindData()
,因此它确保在绑定之前有一些数据要绑定打电话。)
我还认为事件通信而不是直接调用presenter方法在95%的情况下都是过度杀伤。