概述
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模式,都是很是優秀的模型,值得咱們更進一步去研究。