当前位置: 首页 > news >正文

MVC与MVP(转)

MVC模式已经出现了几十年了,在GUI领域已经得到了广泛的应用,由于微软ASP.NET MVC Framework的出现,致使MVC一度成为.NET社区的热名话题。作为MVC的变种MVP模式,也已经出现好几年了,在微软模式与实践小组提供的 Web Client Software Factory中,给出了实现MVP模式的应用程序最佳实践,本文将试着对这两种实现比较一二。

MVC (Model-View-Controller,模型-视图-控制器)模式是80年代Smalltalk-80出现的一种软件设计模式,后来得到了广泛的应用,其主要目的在于促进应用中模型,视图,控制器间的关注的清晰分离。MVP(Model-View-Presenter,模型-视图-表示器)模式则是由IBM开发出来的一个针对C++和Java的编程模型,大概出现于2000年,是MVC模式的一个变种,主要用来隔离UI、UI逻辑和业务逻辑、数据。在下面的文字中,如无特别说明,MVC均指ASP.NET MVC Framework。

处理流程

对于处理流程方面两者的区别,用下面这两幅图就可以说明一切:

 

图1:Model-View-Controller

 

图2:Model-View-Presenter

处理流程方面,在MVC中,用户的请求首先会到达Controller,由Controller从Model获取数据,选择合适的View,把处理结果呈现到View上;在MVP中,用户的请求首先会到达View,View传递请求到特定的Presenter,Presenter从Model获取数据后,再把处理结果通过接口传递到View。

View区别

ASP.NET MVC Framework中的View可以是一个ASP.NET页面、用户控件或者是母版页。需要分别s继承于ViewPage、ViewUserControl、ViewMasterPage。示例代码:

public partial class Views_Blog_New : ViewPage{    }

采用行内代码进行数据的呈现,当然也可以使用服务器控件,示例代码:

<h2>ASP.NET MVC Framework Sample</h2><hr /><%=Html.ActionLink("Home", "Index")%> |<%=Html.ActionLink("New Post", "New")%><div>    <%foreach (Post post in ViewData)      { %>    <div class="postitem">        <strong>Title</strong>:<%=Html.Encode(post.Title) %></br>        <strong>Author</strong>:<%=Html.Encode(post.Author) %></br>        <strong>PubDate</strong>:<%=Html.Encode(post.PubDate.ToShortDateString()) %></br>        <strong>Content</strong>:<%=Html.Encode(post.Description) %></br>        <%=Html.ActionLink("Edit", new {action="Edit", Id=post.Id })%>    </div><br />    <% } %></div>

在MVP中,仍然采用WebForm模型,其中View分为View接口和View实现两部分,实现部分可以是ASP.NET页面、用户控件或者母版页:

public interface IProductDetail{    string Name { set;}    string Brand { set;}}
public partial class Products_ProductDetail : Page, IProductDetail{}

使用服务器控件进行呈现(也可以是HTML控件):

<asp:Content ID="content" ContentPlaceHolderID="DefaultContent" Runat="Server">    <h1>ProductDetail</h1>    <p>名称:<asp:Label ID="lbl_Name" runat="server" Text=""></asp:Label></p>    <p>品牌:<asp:Label ID="lbl_Brand" runat="server" Text=""></asp:Label></p>  </asp:Content>

Controller和Presenter

ASP.NET MVC Framework中,一个View在整个应用程序中可以被多个Controller所调用。

public class PostController : Controller{    [ControllerAction]    public void New()    {        RenderView("New");    }}public class BlogController : Controller{    [ControllerAction]    public void New()    {         RenderView("New");    }}

MVP中一个View在整个应用程序中只对应一个特定的Presenter:

public partial class Products_ProductDetail : Page, IProductDetail{    private ProductDetailPresenter _presenter;    protected void Page_Load(object sender, EventArgs e)    {        if (!this.IsPostBack)        {            this._presenter.OnViewInitialized();        }        this._presenter.OnViewLoaded();    }    [CreateNew]    public ProductDetailPresenter Presenter    {        set        {            this._presenter = value;            this._presenter.View = this;        }    }}

对开发过程的影响

在ASP.NET MVC Framework中,采用行内代码进行数据呈现,逻辑集中在Controller中,但是View无法完全交给UI设计人员完成。在MVP模式中,所有的业务逻辑交给Presenter去处理,这样View中代码就变得及其简洁,将可以轻易的把开发人员和UI设计人员分开,如下图所示:

 

对单元测试的支持

在单元测试方面的支持,ASP.NET MVC Framework在出现的时候就讲促进清晰的关注分离,可测试性和TDD。MVC Framewrok中的所以核心契约都是基于接口的,可以轻易地通过Mock来模拟。可以不用在ASP.NET进程中运行控制器,就能进行单元测试。同时可以使用你想使用的任何单元测试框架来做单元测试,包括NUnit, MBUnit, MS Test等等。

MVP模式的出现,在一定程度上是为了便于UI的单元测试。由于所有的处理都放在了Presenter中,View中的代码变得及其干净简单,所以可以很方便的进行单元测试,Web Client Software Factory中,提供了自动化项目指导包,可以直接创建测试项目。

结束语

对于ASP.NET MVC Framework和WCSF中的MVP模式之小小比较,到这里就结束了,不管是ASP.NET MVC Framework还是WCSF中的MVP模式,都是非常优秀的模型,值得我们更进一步去研究。

相关文章:

  • IDisposable资源释放接口
  • 多角度看.NET面试题
  • java/.net-常用工具下载地址常用学习网址快捷键
  • 財哥面京东dm的经历【帮財哥发的】
  • 基于数据访问的集合类型-领域驱动设计的又一种特定对象
  • LVS负载均衡中arp_ignore和arp_annonuce参数配置的含义
  • Flex入门(三)——微架构之Cairngorm
  • Clink(Powerful Bash-style command line editing )
  • 通俗理解C#委托和事件
  • Select Year,Month,Day date from DropDownList control in ASP.NET
  • Codeforces Round #261 (Div. 2) D 树状数组应用
  • MFC三种不同方式实现图形的保存和重绘---方法一:通过集合类CPtrArray保存点的坐标...
  • String,StringBuffer与StringBuilder的差别??
  • jsp+servlet 分页笔记
  • web 开发之js---js 实现地址栏的表单提交加密编码
  • Python_网络编程
  • Swift 中的尾递归和蹦床
  • TypeScript迭代器
  • ------- 计算机网络基础
  • 聊聊springcloud的EurekaClientAutoConfiguration
  • 树莓派 - 使用须知
  • 微信小程序设置上一页数据
  • 我是如何设计 Upload 上传组件的
  • 一份游戏开发学习路线
  • 移动端解决方案学习记录
  • 【运维趟坑回忆录 开篇】初入初创, 一脸懵
  • TPG领衔财团投资轻奢珠宝品牌APM Monaco
  • 继 XDL 之后,阿里妈妈开源大规模分布式图表征学习框架 Euler ...
  • #LLM入门|Prompt#1.7_文本拓展_Expanding
  • #QT(智能家居界面-界面切换)
  • (C语言)字符分类函数
  • (SpringBoot)第七章:SpringBoot日志文件
  • (汇总)os模块以及shutil模块对文件的操作
  • (十三)Flask之特殊装饰器详解
  • ****** 二十三 ******、软设笔记【数据库】-数据操作-常用关系操作、关系运算
  • .net MySql
  • .NET 反射 Reflect
  • .net6+aspose.words导出word并转pdf
  • .NET6实现破解Modbus poll点表配置文件
  • .考试倒计时43天!来提分啦!
  • /etc/skel 目录作用
  • @Conditional注解详解
  • @Mapper作用
  • [ C++ ] STL---stack与queue
  • [100天算法】-二叉树剪枝(day 48)
  • [ACTF2020 新生赛]Upload 1
  • [BUUCTF]-PWN:[极客大挑战 2019]Not Bad解析
  • [c++] 单例模式 + cyberrt TimingWheel 单例分析
  • [CLickhouse] 学习小计
  • [Codeforces1137D]Cooperative Game
  • [HCIE] IPSec-VPN (手工模式)
  • [HTML]Web前端开发技术7(HTML5、CSS3、JavaScript )CSS的定位机制——喵喵画网页
  • [ISCTF 2023]——Web、Misc较全详细Writeup、Re、Crypto部分Writeup
  • [LeetBook]【学习日记】获取子字符串 + 颠倒子字符串顺序
  • [linux] git lfs install 安装lfs