• [转帖]ASP.NET MVC Framework与WCSF中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。

    处理流程

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

    MVCVSMVP_001

    图1:Model-View-Controller

    MVCVSMVP_002

    图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设计人员分开,如下图所示:

    MVCVSMVP_003

    对单元测试的支持

    在单元测试方面的支持,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模式,都是非常优秀的模型,值得我们更进一步去研究。

    原帖:http://www.cnblogs.com/Terrylee/archive/2008/01/01/aspnet-mvc-framework-vs-wcsf-mvp.html

  • 相关阅读:
    grunt 执行
    Android Studio常见问题 -- AndroidManifest.xml 覆盖问题
    mac系统如何进行剪切
    转-Android Studio *.jar 与 *.aar 的生成与*.aar导入项目方法
    [转]--android studio 使用gradle 导出jar包,并打包assets目录
    [转] Java内部类详解
    [转 ]-- Java线程池使用说明
    Java 实现阶乘算法
    Java 实现二分法查找算法
    [转]-用Gradle 构建你的android程序
  • 原文地址:https://www.cnblogs.com/68681395/p/2056105.html
Copyright © 2020-2023  润新知