ASP.NET MVC 4框架揭秘:MVP(2)[1]

 我来答
会哭的礼物17
2022-10-06 · TA获得超过1.2万个赞
知道大有可为答主
回答量:6204
采纳率:100%
帮助的人:34.7万
展开全部

     MVP( )

  PV模式将所有的UI处理逻辑全部定义在Presenter上 意味着所有的UI处理逻辑都可以被测试 所以从可测试性的角度来这是一种不错的选择 但是它要求将View中可供操作的UI元素定义在对应的接口中 对于一些复杂的富客户端(Rich Client)View来说 接口成员将会变得很多 这无疑会提升编程所需的代码量 从另一方面来看 由于Presenter需要在控件级别对View进行细粒度的控制 这无疑会提供Presenter本身的复杂度 往往会使原本简单的逻辑复杂化 在这种情况下我们往往采用SC模式

  在SC模式下 为了降低Presenter的复杂度 我们将诸如数据绑定和格式化这样简单的UI处理逻辑转移到View中 这些处理逻辑会体现在View实现的接口中 尽管View从Presenter中接管了部分UI处理逻辑 但是Presenter依然是整个三角关系的驱动者 View被动的地位依然没有改变 对于用户作用在View上的交互操作 View本身并不进行响应 而是直接将交互请求转发给Presenter 后者在独立完成相应的处理流程(可能涉及针对Model的调用)之后会驱动View或者创建新的View作为对用户交互操作的响应

   View和Presenter交互的规则(针对SC模式)

  View和Presenter之间的交互是整个MVP的核心 能否正确地应用MVP模式来架构我们的应用主要取决于能否正确地处理View和Presenter两者之间的关系 在由Model View和Presenter组成的三角关系中 核心不是View而是Presenter Presenter不是View调用Model的中介 而是最终决定如何响应用户交互行为的决策者

  打个比方 View是Presenter委派到前端的客户代理 而作为客户的自然就是最终的用户 对于以鼠标/键盘操作体现的交互请求应该如何处理 作为代理的View并没有决策权 所以它会将请求汇报给委托人Presenter View向Presenter发送用户交互请求应该采用这样的口吻 我现在将用户交互请求发送给你 你看着办 需要我的时候我会协助你 而不应该是这样 我现在处理用户交互请求了 我知道该怎么办 但是我需要你的支持 因为实现业务逻辑的Model只信任你

  对于Presenter处理用户交互请求的流程 如果中间环节需要涉及到Model 它会直接发起对Model的调用 如果需要View的参与(比如需要将Model最新的状态反应在View上) Presenter会驱动View完成相应的工作

  对于绑定到View上的数据 不应该是View从Presenter上 拉 回来的 应该是Presenter主动 推 给View的 从消息流(或者消息交换模式)的角度来讲 不论是View向Presenter完成针对用户交互请求的通知 还是Presenter在进行交互请求处理过程中驱动View完成相应的UI操作 都是单向(One Way)的 反应在应用编程接口的定义上就意味着不论是定义在Presenter中被View调用的方法 还是定义在IView接口中被Presenter调用的方法最好都没有返回值 如果不采用方法调用的形式 我们也可以通过事件注册的方式实现View和Presenter的交互 事件机制体现的消息流无疑是单向的

  View本身仅仅实现单纯的 独立的UI处理逻辑 它处理的数据应该是Presenter实时推送给它的 所以View尽可能不维护数据状态 定义在IView的接口最好只包含方法 而避免属性的定义 Presenter所需的关于View的状态应该在接收到View发送的用户交互请求的时候一次得到 而不需要通过View的属性去获取

   实例演示 SC模式的应用(S )

  为了让读者对MVP模式 尤其是该模式下的View和Presenter之间的交互方式有一个深刻的认识 我们现在来做一个简单的实例演示 本实例采用上面提及的关于员工查询的场景 并且采用ASP NET Web Forms来建立这个简单的应用 最终呈现出来的效果如图 所示 前面我们已经演示了采用PV模式下的IView应该如何定义 现在我们来看看SC模式下的IView有何不同

  先来看看表示员工信息的数据类型如何定义 我们通过具有如下定义的数据类型Employee来表示一个员工 简单起见 我们仅仅定义了表示员工基本信息(ID 姓名 性别 出生日期和部门)的 个属性

  public class Employee

  {

  public string       Id { get; private set; }

  public string       Name { get; private set; }

  public string       Gender { get; private set; }

  public DateTime         BirthDate { get; private set; }

  public string       Department { get; private set; }

  public Employee(string id string name string gender

  DateTime birthDate string department)

  {

  this Id             = id;

  this Name           = name;

  this Gender         = gender;

  this BirthDate      = birthDate;

  this Department   = department;

  }

  }

lishixinzhi/Article/program/net/201311/16126

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式