程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> ASP.NET >> 關於ASP.NET >> .NET初學者架構設計指南(四)Model-View-Controller

.NET初學者架構設計指南(四)Model-View-Controller

編輯:關於ASP.NET

Model-View-Controller簡稱為MVC,這是圖形界面(GUI)應用程序的一種架構形式。Model是業務領 域層,比如我們在前面兩篇裡面提到的Account、Entry、Bill、Invoice之類的對象,這些類構成了一個 電信賬務系統的業務領域層;View就是用戶界面;Controller是指用戶界面和業務對象之間的控制器, 控制器的作用是從業務對象中獲取數據顯示到用戶界面上,並且從界面上收集用戶的輸入和動作,然後 調用業務對象完成業務功能。

大部分軟件系統的工作可以總結成下面這樣的流程:從存儲數據的 地方取得數據,把他們顯示在用戶界面上,然後用戶在界面上修改這些數據,再把數據寫回存儲。數據 在存儲和界面之間來回流動。這種看似簡單的分析方式經常讓開發者有這樣一種沖動:把界面和數據寫 在一起,這樣可以少很多層次,少寫很多代碼,也可以減少運行過程的環節,似乎可以加快程序的運行 效率。但是實際上,這種直來直去的煙囪式系統不能很好的隔離界面和業務代碼,在開發和維護的過程 中會帶來很多麻煩。

把程序的界面和業務代碼分離開會帶來很多好處。一般的說來,界面比起業 務邏輯來變化來的更加頻繁一些,修改界面的時候,不應該對業務代碼造成影響;開發這兩個部分所使 用的技巧也有很大的差別;在有些系統裡面,需要為同一個功能開發多種界面,比如一個Windows窗體界 面給後台管理人員使用,一個Web頁界面提供給廣大人民群眾,還需要做一個適用於PDA浏覽器的界面, 如果界面和業務代碼是混雜在一起的,多種界面的開發就需要做很多重復性的工作;把界面和業務代碼 分離開也使可以為自動化的單元測試提供很多方便,要對用戶界面創建單元測試代碼是十分繁雜的,而 對業務代碼做單元測試則是簡單的,也是必要的。

於是有經驗的開發者會在設計程序的時候創建 一個業務領域層,在這個層次中有很多業務對象,他們直接體現了業務需求的核心。用戶界面層不是自 己實現業務功能,而是調用後台的業務對象。用戶界面向用戶展示業務對象的屬性,並且捕獲用戶的輸 入,調用業務對象的方法實現各種功能需求。當業務邏輯層和用戶界面層都具備了以後,剩下的一個問 題就是:如何把這兩個層次粘和起來——這就是控制器需要做的工作。

最簡單的控制 方式就是直接在界面中調用業務對象,這種方式稱為Model-View模式。

Model-View模式在界 面和業務模型之間建立了一種最簡單的依賴關系,界面直接調用業務模型,模型通過消息這樣的松耦合 方式修改界面上的表示內容(比如上一篇裡面使用C#語言中的事件實現告警在界面上的顯示)。這樣可 以實現層次的分離,對改善軟件系統的構架是有一定的幫助的。

使用過Microsoft Visual Studio各個版本的開發者一定對Model-View的控制方式非常熟悉,無是在VB、VC,還是後來的C#、 ASP.NET中,我們把一個按鈕控件拖放到窗體上,然後鼠標點擊這個控件,就會自動生成一段事件響應代 碼。下面是用這種方式編寫的一段程序,這是“非洲電信公司賬務系統”的一個界面,營業 員使用這個界面為用戶繳費:

營業員在“號 碼”輸入框裡面填寫用戶的電話號碼,在“金額”輸入框裡填寫需要交的金額,然後點 擊“提交”按鈕,就可以把錢交進賬戶。如果發生了異常情況,程序會出現提示。

按 下“提交”按鈕的時候,按鈕發出Click事件,窗體可以捕獲這個事件,采取響應行動。控制 器就是用這樣的機制實現的。

private void button1_Click(object sender, System.EventArgs e)
{
//按下繳費按鈕,調用業務對象,實現繳費功能
try
{
string phone_no = textBox1.Text;
string money = textBox2.Text;
//根據電話號碼得到用戶對象
User user = GetUserByPhoneNumber(phone_no);
//得到這個用戶的賬號
Account account = user.Account;
//調用賬號的Pay,接口給賬號交錢
//Pay接口處理完費用之後要判斷欠費,
//如果不再欠費向交換網絡發指令,給用戶開機
account.Pay(float.Parse(money));
MessageBox.Show("繳費成功了");
}
catch (Exception e)
{
MessageBox.Show(e.Message);
}
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved