学习ASP.NET MVC框架揭秘笔记-PV与SC

1.                                   PV与SC

解决View难以测试最好的办法就是让他无须测试。如果View不需要测试,其先决条件就是让它尽可能不涉及UI处理逻辑,这就是PV模式的目的所在。

如果我们纯粹的采用PV模式来设计View意味着我们需要将View中的UI元素通过属性的形式暴露出来。具体来说,当我们为View定义接口的时候,需要定义基于UI元素的属性使Presenter可以对View进行细粒度操作,但这并不意味着我们直接将View上的控件暴露出来。

举个例子,假如我们开发的HR系统中有这样一个界面,界面上有一个包含所有部门列表的DropDownList,还有一个是显示员工列表的GridView,还有一个查询按钮,我们可以通过查询按钮来讲选择的部门的员工显示出来。

如果为该View定义一个接口IEmployeeView我们不能如下所示的代码将上述的两个控件直接以属性的形式显示出来。针对具体控件类型的数据绑定属于View的内部细节,不能体现在表示用于抽象View的接口中。

public interface IEmployeeView
{
<span style="white-space:pre">	</span>DropDownList     Departments{	  get; }
<span style="white-space:pre">	</span>GridView<span style="white-space:pre">	</span> Employees  {     get;}
}

正确的接口和实现该接口的View应该采用如下的定义方式:Presenter通过对属性Departments和Employees赋值来实现对相应DropDownList和GridView的数据绑定,同时通过属性SelectedDepartment得到用户选择的筛选部门。为了尽可能让接口只暴露必需的信息,我们还特意将对属性的读/写作了控制。

public interface IEmployeeView
{
<span style="white-space:pre">	</span>IEnumerable<String>			Departments{  set;}
<span style="white-space:pre">	</span>String					SelectedDepartment{   get;}
<span style="white-space:pre">	</span>IEnumerable<Employee>		<span style="white-space:pre">	</span>Employees{   set;}
}
public partial class EmployeeView : page , IEmployeeView
{
<span style="white-space:pre">	</span>public IEnumerable<string> Departments
<span style="white-space:pre">	</span>{
<span style="white-space:pre">		</span>Set
<span style="white-space:pre">		</span>{
<span style="white-space:pre">			</span>this.DropDownListDepartments.DataSource = value;
<span style="white-space:pre">			</span>this.DropDownListDepartments.DataBind();
<span style="white-space:pre">		</span>}
<span style="white-space:pre">	</span>}
<span style="white-space:pre">	</span>public string SelectedDepartment
<span style="white-space:pre">	</span>{
<span style="white-space:pre">		</span>get{
<span style="white-space:pre">			</span>return this.DropDownListDepartments.SelectedValue;
<span style="white-space:pre">		</span>}
<span style="white-space:pre">	</span>}
<span style="white-space:pre">	</span>public IEnumerable<Employee>  Employees
<span style="white-space:pre">	</span>{
<span style="white-space:pre">		</span>set
<span style="white-space:pre">		</span>{
<span style="white-space:pre">			</span>this.GridViewEmployees.DataSource = value;
<span style="white-space:pre">			</span>this.GridViewEmployees.DataBind();
<span style="white-space:pre">		</span>}
<span style="white-space:pre">	</span>}
}

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

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

时间: 2024-10-06 07:20:09

学习ASP.NET MVC框架揭秘笔记-PV与SC的相关文章

学习ASP.NET MVC框架揭秘笔记目录

学习ASP.NET MVC框架揭秘笔记目录 第一章     ASP.NET+MVC 1.1传统的MVC模式 持续更新中,,,,

学习ASP.NET MVC框架揭秘笔记-IIS/ASP.NET管道(一)

IIS/ASP.NET管道 ASP.NET MVC就是建立在ASP.NET平台基础上基于MVC模式的Web应用框架,深入理解ASP.NET MVC的前提是对ASP.NET管道式设计有深刻的认识.由于ASP.NET Web应用大都寄宿于IIS上,接下来会介绍3个主要的IIS版本对各自Web请求的处理方式. 1.3.1 IIS 5.x与ASP.NET IIS 5.x运行在进程InetInfo.exe中,该进程寄宿着一个名为World WideWeb Publishing Service(简称W3SV

学习ASP.NET MVC框架揭秘笔记-MVP

1.2.1                      MVP MVP是一种UI架构模式,适用于基于事件驱动的应用框架.MVP中的M和V分别对应MVC的Model和View,而P(Presenter)代替了Controller. 在MVP模式中,能够与Model直接进行交互的仅限于Presenter,View只能通过Presenter间接地调用Model.Model的独立性在这里得到真正的体现,他不仅仅与可视化元素的呈现无关,与UI处理逻辑(Presenter)也无关. MVP不仅仅避免了View

学习ASP.NET MVC框架揭秘笔记-传统MVC模式

1.1传统MVC模式 对于大部分面向最终用户的应用来说,他们都需要具有一个与用户进行交互的可视化UI界面,我们将这个UI称为视图(View).在早期,我们倾向于将所有与UI相关的操作糅合在一起,这些操作包括UI界面的呈现.用户交互操作的捕捉与响应.业务流程的执行及对数据的存取等,我们将这种设计模式称为自治视图(Autonomuous View  ,  AV). 1.1.1  自治视图 1.1.2  什么是MVC模式

学习ASP.NET MVC框架揭秘笔记-自治视图

1.1.1自治视图 一个典型的人机交互应用具有3个主要的关注点,既数据在可视化界面上的呈现.UI处理逻辑(用于处理用户交互式操作的逻辑)和业务逻辑.自治视图模式将三者混合在一起,势必会带来如下一些问题. 1.重用性.业务逻辑是与UI无关的,应该最大限度地被重用,但是若将业务逻辑定义在自治视图中相当于使他完全与视图本身绑定在一起.除此之外,如果我们能够将UI的行为抽象出来,基于抽象化UI的处理逻辑也是可以被共享的,但是定义在自治视图中的UI处理逻辑也完全丧失了重用的可能. 2.稳定性.业务逻辑具有

学习ASP.NET MVC框架揭秘笔记-什么是MVC模式

1.1.2什么是MVC模式 MVC的创建者是Trygve M.H.Reenskau,他是挪威的计算机专家,同时也是奥斯陆大学的名誉教授.MVC是他在1979年提出的一种主要针对GUI应用的软件架构模式. MVC体现了"关注点分离"这一基本的设计方针,他将一个人机交互应用设计的功能分为Model.Controller和View三部分,他们各自具有如下的职责. 1.Model是对应用状态和业务逻辑的封装,我们可以将它理解为同时包含数据和行为的领域模型.Model接受Controller的请

学习ASP.NET MVC框架揭秘笔记-实例演示:SC模式的应用

实例演示:SC模式的应用 为了对SC模式下的MVP,尤其是该模式下的View和Presenter之间的交互方式有一个深刻的认识,我们现在来做一个实例演示.我们采用员工查询的场景,用ASP.NET Web Forms来建立这个简单的应用. 我们先来定义员工的数据类型,Employee来表示一个员工,有5个属性:ID.姓名.性别.出生日期和部门. public class Employee { public string Id { get; private set; } public string

学习ASP.NET MVC框架揭秘笔记-IIS/ASP.NET管道(二)

IIS7.0与ASP.NET IIS7.0在请求的监听和分发机制上又进行了革新性的改进,主要体现在引入Window进程激活服务(Windows Process Activation Service,WAS)分流了原来(IIS6.0)W3SVC承载的部分功能.IIS6.0中W3SVC主要承载着如下三大功能. 1.HTTP请求接收:接收HTTP.SYS监听到的HTTP请求. 2.配置管理:从元数据库(metabase)中加载配置信息对相关组件进行配置. 3.进程管理:创建.回收.监控工作进程. II

学习ASP.NET MVC框架揭秘笔记-IIS/ASP.NET管道(三)

ASP.NET管道 以IIS6.0为例,它在工作进程w3wp.exe中会利用aspnet_isapi.dll加载.NET运行时(如果.NET运行时尚未加载).IIS6.0引入了应用程序进程池的概念,一个工作进程对应着一个应用程序池.一个应用程序进程池可以承载一个或者多个Web应用,每个Web应用映射到一个IIS虚拟目录.与IIS5.x一样,每一个Web应用运行在各自的应用程序域中. 如果HTTP.SYS接收到的HTTP请求是对该Web应用的第一次访问,在成功加载运行时后,IIS会通过AppDom