MVC架构在Asp.net中的应用和实现
MVC架構(gòu)在Asp.net中的應(yīng)用和實現(xiàn)
摘要:本文主要論述了MVC架構(gòu)的原理、優(yōu)缺點以及MVC所能為Web應(yīng)用帶來的好處。并以“成都市信息化資產(chǎn)管理系統(tǒng)”框架設(shè)計為例,詳細(xì)介紹其在Asp.net環(huán)境下的具體實現(xiàn)。旨在幫助Web設(shè)計開發(fā)者更好的了解和掌握MVC,合理利用MVC構(gòu)建優(yōu)秀的Web應(yīng)用。
關(guān)鍵字:MVC、視圖、控制器、模型、Asp.net
?Application and Implementation of MVC Construction in Asp.net
Abstract: This article mainly elaborated the construction principle of MVC, the merits and shortcoming as well as MVC can be an advantage, which the Web application brings. And take “the Chengdu informationization property management system management system” the frame design as the example, introduces its concrete realization in detail under Asp. net environment. Is for the purpose of helping Web to design an exploiter better understanding and to grasp MVC, reasonably constructs the outstanding Web application using MVC.
Keywords: MVC 、View 、Controller、Model、Asp.net
?
0 引言
許多Web應(yīng)用都是從數(shù)據(jù)存儲檢索數(shù)據(jù)并將其顯示給用戶。在用戶更改數(shù)據(jù)之后,系統(tǒng)再將更新內(nèi)容存儲到數(shù)據(jù)存儲中。因為關(guān)鍵的信息流發(fā)生在數(shù)據(jù)存儲和用戶界面之間,所以很多應(yīng)用將數(shù)據(jù)和用戶界面這兩部分綁在一起,以減少編碼量并提高應(yīng)用程序性能。但是,這種看起來自然而然的方法有一些大問題。一是,用戶界面的更改往往比數(shù)據(jù)存儲系統(tǒng)的更改頻繁得多。二是,這種耦合往往會并其他業(yè)務(wù)邏輯。那么如何讓 Web 應(yīng)用程序的用戶界面功能實現(xiàn)模塊化,以便可以輕松地單獨修改各個部分呢?面向?qū)ο蟮脑O(shè)計模式是經(jīng)驗的總結(jié),MVC架構(gòu)可以很好地解決上述問題。
.NET是當(dāng)今設(shè)計和開發(fā)各種Web應(yīng)用的主流平臺,MVC架構(gòu)在J2EE平臺上已有成熟的設(shè)計方案,而在.NET平臺上卻少有應(yīng)用。所以討論其在Asp.net環(huán)境下的應(yīng)用和實現(xiàn),仍很有意義。
本文首先論述了MVC架構(gòu)的原理、優(yōu)缺點以及它所能為Web應(yīng)用帶來的好處。并結(jié)合作者在“成都微軟技術(shù)中心”實習(xí)期間,研發(fā)項目的經(jīng)驗。介紹了一種在Asp.net環(huán)境下的實現(xiàn)方式。旨在幫助Web設(shè)計開發(fā)者更好的了解和掌握MVC,合理利用MVC構(gòu)建優(yōu)秀的Web應(yīng)用。雖然本文是在.net環(huán)境下的實現(xiàn),但這并不妨礙你對MVC架構(gòu)的理解。學(xué)習(xí)MVC架構(gòu),重在學(xué)習(xí)其思想。
?
1 MVC介紹
MVC是一種軟件開發(fā)架構(gòu),它包含了很多的設(shè)計模式[1],最為密切是以下三種:Observer (觀察者模式), Composite(組合模式)和Strategy(策略模式)。MVC最初是在Smalltalk-80中被用來構(gòu)建用戶界面的[2]。
MVC架構(gòu)把數(shù)據(jù)處理,程序輸入輸出控制及數(shù)據(jù)顯示分離開來,并且描述了不同部件的對象間的通信方式。使得軟件可維護(hù)性,可擴(kuò)展性,靈活性以及封裝性大大提高;MVC(Model-View-Controller)把系統(tǒng)的組成分解為M(模型)、V(視圖)、C(控制器)三種部件。視圖表示數(shù)據(jù)在屏幕上的顯示??刂破魈峁┨幚磉^程控制,它在模型和視圖之間起連接作用??刂破鞅旧聿惠敵鋈魏涡畔⒑妥鋈魏翁幚?#xff0c;它只負(fù)責(zé)把用戶的請求轉(zhuǎn)成針對Model的操作,和調(diào)用相應(yīng)的視圖來顯示Model處理后的數(shù)據(jù)。三者之間關(guān)系如下圖2.1:
?? 圖2.1? MVC關(guān)系圖
?
2、為什么要在Web應(yīng)用中使用MVC架構(gòu)
用戶界面邏輯的更改往往比業(yè)務(wù)邏輯頻繁,尤其是在基于Web的應(yīng)用程序中。例如,可能添加新的用戶界面頁,或者可能完全打亂現(xiàn)有的頁面布局。對顯示的更改,盡可能地不要影響到數(shù)據(jù)和業(yè)務(wù)邏輯。
目前大部分Web應(yīng)用都是將數(shù)據(jù)代碼和表示混在一起。經(jīng)驗比較豐富的開發(fā)者會將數(shù)據(jù)從表示層分離開來,但這通常不是很容易做到的,它需要精心的計劃和不斷的嘗試。MVC從根本上強(qiáng)制性的將它們分開。盡管構(gòu)造MVC應(yīng)用需要一些額外的工作,但它帶來的好處是無庸質(zhì)疑的。
2.1 提高代碼重用率
最重要的一點是多個視圖能共享一個模型,無論用戶想要Flash界面或是 WAP 界面;用一個模型就能處理它們。由于已經(jīng)將數(shù)據(jù)和業(yè)務(wù)規(guī)則從表示層分開,所以可以最大化的重用代碼。
2.2 提高程序的可維護(hù)性
因為模型是自包含的,并且與控制器和視圖相分離,所以很容易改變數(shù)據(jù)層和業(yè)務(wù)規(guī)則[3]。例如,把數(shù)據(jù)庫從MySQL移植到Oracle,或者把基于RDBMS數(shù)據(jù)源改變到LDAP,只需改變模型即可。一旦正確的實現(xiàn)了模型,不管數(shù)據(jù)來自哪里,視圖都會正確的顯示它們。MVC架構(gòu)的運用,使得程序的三個部件相互對立,大大提高了程序的可維護(hù)性。
2.3 有利于團(tuán)隊開發(fā)
在開發(fā)過程中,可以更好的分工,更好的協(xié)作。有利于開發(fā)出高質(zhì)量的軟件。良好的項目架構(gòu)設(shè)計,將減少編碼工作量 :采用MVC結(jié)構(gòu) + 代碼生成器,是大多數(shù)Web應(yīng)用的理想選擇。部分模型(Model)、和存儲過程一般可用工具自動生成??刂?Controller)器比較穩(wěn)定,一般由于架構(gòu)師(也可能是有經(jīng)驗的人)完成;那么整個項目需要手動編寫代碼的地方就只有視圖(View)了。在這種模式下,個人能力不在特別重要,只要懂點語法基礎(chǔ)的人都可以編寫,無論項目成員寫出什么樣的代碼,都在項目管理者的可控范圍內(nèi)。即使項目中途換人,也不會有太大問題。在個人能力參差不齊的團(tuán)隊開發(fā)中,采用MVC開發(fā)是非常理想的。
??
3 MVC在 Asp.net中的原理及實現(xiàn)
| Asp.net提供了很好實現(xiàn)這種模式的類似環(huán)境。通過在ASPX頁面中開發(fā)用戶部件或繼承母板頁MasterPage來實現(xiàn)視圖;控制器的功能一般可以放在對應(yīng)的邏輯功能代碼(.cs)中實現(xiàn);模型通常對應(yīng)應(yīng)用系統(tǒng)的業(yè)務(wù)部分。模型一般包含業(yè)務(wù)邏輯、業(yè)務(wù)規(guī)則和數(shù)據(jù)訪問層。MVC可和經(jīng)典的N層結(jié)構(gòu)配合使用。將用戶顯示(視圖)從動作(控制器)中分離出來,提高了代碼的重用性。將數(shù)據(jù)(模型)從對其操作的動作(控制 器)分離出來可以設(shè)計一個與后臺存儲數(shù)據(jù)無關(guān)的系統(tǒng)。就MVC結(jié)構(gòu)的本質(zhì)而言,它是一種解決耦合系統(tǒng)問題的方法[4]。實現(xiàn)基于MVC的應(yīng)用需要完成以下步驟,如右圖3.1所示: |
?
1、分析當(dāng)前應(yīng)用,分解系統(tǒng)功能:
分析當(dāng)前應(yīng)用問題,分離出系統(tǒng)的內(nèi)核功能(Model)、系統(tǒng)的輸入輸出(View)、系統(tǒng)的輸流程控制,行為控制等控制功能(Controller)三大部分。
2、設(shè)計和實現(xiàn)模型:
設(shè)計模型部件使其封裝應(yīng)用功能、屬性。提供訪問顯示數(shù)據(jù)的操作,提供控制內(nèi)部行為的操作以及其他必要的操作接口。這部分的構(gòu)成與具體的應(yīng)用問題緊密相關(guān)。
3、設(shè)計和實現(xiàn)視圖:
設(shè)計每個視圖的顯示形式,視圖從模型中獲取數(shù)據(jù),并將數(shù)據(jù)顯示在屏幕上。提供發(fā)送用戶請求給控制器;提供允許控制器選擇視圖。
4、設(shè)計和實現(xiàn)控制器:
對于每個視圖,實現(xiàn)對用戶的請求映射到模型。并根據(jù)模型處理結(jié)果,選擇合適的視圖顯示。在模型狀態(tài)的影響下,控制器使用特定的方法接受和解釋這些事件。控制器的初始化建立起與模型和視圖的聯(lián)系,(這里一般會用觀察者模式)并且啟動事件處理機(jī)制。事件處理機(jī)制的具體實現(xiàn)方法依賴于界面的工作平臺。
MVC并沒有明確的定義,它僅代表一種軟件設(shè)計思想。所以在不同的應(yīng)用環(huán)境下,可能有不同的實現(xiàn)方式。只有深刻理解其思想,結(jié)合實際情況。才能構(gòu)建合理的應(yīng)用。下面以“成都市信息化資產(chǎn)管理系統(tǒng)”框架設(shè)計為例,介紹MVC構(gòu)架在Asp.net下的一種實現(xiàn)方式。該框架中并沒有使用觀察者模式,因為依賴關(guān)系(本項目中只有兩種視圖,列表頁面和編輯、查看詳情頁面。而且將來增加視圖的可能性也不大)固定或者幾乎固定時,加入一個觀察者模式,只會增加系統(tǒng)復(fù)雜性。
本項目框架結(jié)構(gòu)包括邏輯結(jié)構(gòu)圖3.2和物理結(jié)構(gòu)圖3.3兩部分。
??
從邏輯結(jié)構(gòu)圖,可以看出對數(shù)據(jù)庫的訪問并沒有完全用存儲過程,這是出于運行效率和開發(fā)效率的考慮。
這里的存儲過程對每個實體都只包括基本的CRUD四種操作。
3.1 View(視圖)
3.1.1原理
視圖用于管理信息的顯示,它提供用戶交互界面。使用多個包含單頁面顯示的用戶部件,復(fù)雜的Web頁面可以展示來自多個數(shù)據(jù)源的內(nèi)容,并且網(wǎng)頁人員,美工能獨自參與這些Web頁面的開發(fā)和維護(hù)。在Asp.net下,視圖的實現(xiàn)很簡單??梢韵耖_發(fā)WINDOWS界面一樣直接在集成開發(fā)環(huán)境下通過拖動部件來完成頁面開發(fā)本。每一個頁面也可以采用復(fù)合視圖的形式即:一個頁面由多個子視圖(用戶部件)組成;也可以繼承母板頁MasterPage。子視圖可以是最簡單HTML?部件、服務(wù)器部件或多個部件嵌套構(gòu)而成的Web自定義部件或Web頁面。 頁面都由模板定義,模板定義了頁面的布局,用戶部件的標(biāo)簽和數(shù)目,用戶指定一個模板(這里的模板指Html頁面、Asp.net頁面、用戶部件等),.net平臺根據(jù)這些信息自動創(chuàng)建頁面。針對靜態(tài)的模板內(nèi)容,如頁面上的站點 導(dǎo)航,菜單,友情鏈接,這些使用缺省的模板內(nèi)容配置;針對動態(tài)的模板內(nèi)容(主要是業(yè)務(wù)內(nèi)容),由于用戶的請求不同,只能使用后期綁定,并且針對用戶的不同,用戶部件的顯示內(nèi)容進(jìn)行過濾。使用由用戶部件根據(jù)模板配置組成的組合頁面,它增強(qiáng)了可重用性,并簡化了站點的布局。在.Asp.net2.0中,可以使用MasterPage來簡化視圖設(shè)計。在MasterPage里設(shè)置的Skin(皮膚),會根據(jù)不同子視圖(繼承自MasterPage頁)中的Them(主題)。自動選擇合適的Skin顯示??梢哉fMasterPage是MVC架構(gòu)思想的很好體現(xiàn)。
視圖部分大致處理流程如下:首先,頁面模板定義了頁面的布局;頁面配置文件定義視圖標(biāo)簽的具體內(nèi)容(用戶部件);然后,由頁面布局策略類初始化并加載頁面;每個用戶部件根據(jù)它自己的配置進(jìn)行初始化,加載校驗器并設(shè)置參數(shù),以及事件的委托等;用戶提交后,通過了表示層的校驗,用戶部件把數(shù)據(jù)自動提交給業(yè)務(wù)實體即模型。
這一部分主要定義了WEB頁面基類PageBase;頁面布局策略類PageLayout,完成頁面布局,用于加載用戶部件到頁面;用戶部件基類 UserControlBase即用戶控件框架,用于動態(tài)加載檢驗部件,以及實現(xiàn)用戶部件的個性化。為了實現(xiàn)WEB應(yīng)用的靈活性,視圖部分也用到了許多配置文件例如:模板配置、頁面配置、路徑配置、驗證配置等。
3.1.2實現(xiàn)
良好的界面架構(gòu)設(shè)計,將減少界面調(diào)整時間。在.net下應(yīng)充分利用Asp.net2.0新特性,自動導(dǎo)航,SiteMap、MasterPage、MemberShip、MultiView、Them、Skin等。在本項目中,每個模塊的View,實際上都只有兩種,一種是用來顯示多條數(shù)據(jù)的列表頁面,一種是用來編輯、和查看詳情的頁面。由于View種類幾乎是固定的,所以不需要加入Observer(觀察者)模式。讓所有的編輯頁都繼承自“母板頁dialog.master”,所有列表頁都繼承“母板頁Main.master”即可。如圖3.4
?? 每個列表頁面的動態(tài)顯示區(qū)域僅為ContentPlaceHolder即黃色區(qū)域部分,這就保證相同類型頁面風(fēng)格的一致。按照命名規(guī)范和便于理解的原則,我們把所有的編輯頁后綴都取名為“EditPG.aspx”,所有的列表頁后綴都取名為“ListPG.aspx”。對View的改變,可以通過Asp.net2.0的主題(Themes)來實現(xiàn)。本例中編輯和查看詳情頁面,用的就是相同的視圖(View)。如果要添加不同的View,只需添加相應(yīng)的Master,和完成具體的顯示要求。在本項目中,所有的編輯頁面一般只需要實現(xiàn)基類(DialogUIBase)提供的如下方法。
//得到數(shù)據(jù),并存放在對應(yīng)的Model中,供View使用protected?override?void?GetDataFromDB(object?keyValue){…}
//用Model中的數(shù)據(jù)填充編輯或顯示界面
protected?override?void?SetEditText(){…}
????//重新填寫編輯框頁面的部件內(nèi)容,?對部分用戶可能重復(fù)填寫的部件內(nèi)容不進(jìn)行賦默?????????????認(rèn)值操作
protected?override?void?ResetEditText(){…}
//檢查用戶輸入正確性
protected?override?string?CheckUserInput(){…}
//保存用戶輸入,把用戶輸入更新到數(shù)據(jù)庫
protected?override?object?SaveEditText(object?keyValue){…}
???所有的列表View一般也只用實現(xiàn)基類(GridViewUIBase)提供的如下幾個虛方法.
??//返回子類中使用的GridView,子類必須繼承
????protected?override?GridView?GetGridView(){…}?????
???//?返回子類中的GridView中復(fù)選框列模板中復(fù)選框的名稱,子類根據(jù)有無該模板列進(jìn)???行選擇繼承
protected?override?string?GetGridCheckBoxName(){…}
???通常無需處理的繼承方法
???//綁定DataGrid部件事件,
????protected?override?void?BindGridEvent(){…}
???//綁定除通過GetDataGrid()傳入的DataGrid部件以外的部件的客戶端事件
?????protected?override?void?BindControlEvent(){…}
???//?返回GridViewList使用的數(shù)據(jù)源,?子類必須繼承
????protected?override?object?GetDataSource(){…}
??//?多條記錄刪除,在刪除按鈕事件中調(diào)用
????protected?override?void?DelRecords(object?keyValuesString){…}
???//?返回以CommandName為key以GridEventPageParam類型參數(shù)為內(nèi)容的hashtable
protected?override?Hashtable?GetDialogParams(){…}
從以上代碼中可以很容易發(fā)現(xiàn),無論是列表頁面還是編輯頁面,都沒有和流程相關(guān)的東西,這正是MVC所要做的,View中只包含數(shù)據(jù)的顯示,流程完全由基類控制。好處是顯而易見的。不同的人寫出來的View也具有相同的風(fēng)格。
3.2 Controller(控制器)
3.2.1原理
Controller控制器是Model與View之間溝通的橋梁,它可以分派用戶的請求并選擇恰當(dāng)?shù)囊晥D以用于顯示,同時它也可以解釋用戶的輸入并將它們映射為模型層可執(zhí)行的操作。在.NET中每個aspx對應(yīng)了一個后端代碼aspx.cs,可以通過aspx.cs方便地實現(xiàn)Controller的功能。每個Asp.net頁面都有一種機(jī)制,將頁面中的部件所要調(diào)用的方法在一個與其分離的類中實現(xiàn)。這些aspx和ascx文件后端代碼繼承了System.Ul.Web.Page的類執(zhí)行控制器功能,它包括了各種初始化和控制函數(shù)。當(dāng)加載aspx頁面時將調(diào)用Page_ Load事件,當(dāng)aspx頁面從內(nèi)存中被卸載時將調(diào)用Page_UnLoad事件。如果某個部件觸發(fā)頁面以使其被重新加載則將調(diào)用Control Event事件。
3.2.2實現(xiàn)
對應(yīng)所有編輯頁面的控制類為DialogUIBase.cs ,該類完成所有編輯頁面的流程控制、請求控制 ;對應(yīng)所有列表頁面的控制類為GridViewUIBase.cs ,該類完成所有列表頁面的流程控制和請求控制 ;這兩個類都位于App_Code文件夾下。
編輯頁面基類(DialogUIBase)和列表頁面基類(GridViewUIBase)都繼承自System.Web.UI.Page,都包含兩部分,一是供View子類繼承的虛方法,一是對View子類流程控制的方法。
本例中GridViewUIBase中主要包含的方法有:
供子類繼承的方法#region?供子類繼承的方法//返回子類中使用的GridView
protected?virtual?GridView?GetGridView(){…}
//返回子類中的GridView中復(fù)選框列模板中復(fù)選框的名稱,子類根據(jù)有無該模板列進(jìn)行選擇繼承
protected?virtual?string?GetGridCheckBoxName(){…}
//?返回GridView使用的數(shù)據(jù)源
protected?virtual?object?GetDataSource(){…}
//?刪除View中的選擇的數(shù)據(jù)
protected?virtual?void?DelRecords(object?keyValuesString){…}
//?返回以CommandName為key以GridEventPageParam類型參數(shù)為內(nèi)容的hashtable
protected?virtual?Hashtable?GetDialogParams(){…}
//?綁定GridView部件客戶端事件,通本默認(rèn)綁定函數(shù)綁定的客戶端事件,被綁定列的所有行均調(diào)用相同的對話框頁面,如果要不同的行調(diào)用不同的對話框頁面則需要重寫該函數(shù)
protected?virtual?void?BindGridEvent(){…}
//綁定除通過GetGridView()傳入的GridView部件以外的部件的客戶端Click事件
protected?virtual?void?BindControlEvent(){…}
//按鈕事件綁定
public?void?BindBtnEvent(…){…}
//表格事件綁定
public?void?BindGridEvent(…){…}
DialogUIBas類和GridViewUIBase類,設(shè)計思路完全相同。所以不再舉例。從上面當(dāng)面可以發(fā)現(xiàn)在GridViewUIBase中,實現(xiàn)了對View的控制。根據(jù)用戶的請求的不同,調(diào)用不同的Model進(jìn)行處理。
3.3 Model(模型)
3.3.1原理
Model對象代表了商業(yè)規(guī)則和商業(yè)數(shù)據(jù),單個模型代表問題域中的某個對象,或叫做實體。所以模型要封裝系統(tǒng)的應(yīng)用功能和應(yīng)用屬性。提供訪問顯示數(shù)據(jù)的操作,提供控制內(nèi)部行為的操作以及其他必要的操作接口。模型的構(gòu)成與具體的應(yīng)用問題緊密相關(guān)。通常模型包括數(shù)據(jù)訪問、商務(wù)邏輯和商務(wù)規(guī)則。在Asp.net中,簡單的模型可以方便地用自動代碼生成工具實現(xiàn)。VS IDE 2003、VS IDE 2005本身就提供了很好的支持,可以從數(shù)據(jù)庫或XML等數(shù)據(jù)源,輕松的生成強(qiáng)類型的DataSet和DataTable。數(shù)據(jù)訪問層可以使用Application Block塊?;駿nterprise Library 等開源組件。當(dāng)然你也可以手動完成這些工作,如果你愿意。
3.3.2實現(xiàn)
在本示例中,業(yè)務(wù)處理對象和業(yè)務(wù)實體對象都繼承自EntityBase類。EntityBase類又繼承自Entity類。Entity類是數(shù)據(jù)庫訪問的基類。它主要包含供子類繼承的方法(用存儲過程完成數(shù)據(jù)庫的CRUD操作)。和供外部類調(diào)用的方法(Model完成CRUD操作)。設(shè)置兩種方式是因為邏輯結(jié)構(gòu)的需要。
供子類繼承的主要方法如下:
protected?virtual?void?Init(){…}//執(zhí)行必要的初始化protected?virtual?bool?Proc_Insert(){…}?//添加
protected?virtual?bool?Proc_Update(object?KeyValue)?{…}?//更新
protected?virtual?bool?Proc_ReadByKeyValue(object?KeyValue){…}??//檢索
protected?virtual?bool?Proc_Delete(object?KeyValue){…}?//刪除
protected?virtual?DataTable?Proc_ReadAll(){…}?//檢索所有
protected?virtual?void?AfterLoad(){…}?//數(shù)據(jù)庫中數(shù)據(jù)更新模型之前
protected?virtual?void?BeforeSave(){…}//用模型更新數(shù)據(jù)庫之前
供外部調(diào)用的主要方法如下:
public?DataTable?ReadAll(){…}?//檢索所有
public?object?Insert(){…}?//添加
public?object?Update(object?keyValue){…}?//更新
public?bool?Load(object?keyValue){…}?//填充Model
public?bool?Delelte(object?keyValue){…}?//刪除
public?void?Clear()?//清除Model
EntityBase類,只需實現(xiàn)基類(Entity)的四個虛CRUD方法,和定義Model自身相關(guān)的屬性。由于Model又繼承于EntityBase類,所以如果某個Model需要進(jìn)行額外的操作,可添加到該Model對應(yīng)的AfterLoad()或BeforeSave()方法中。
3.4 MVC架構(gòu)的擴(kuò)展設(shè)計
通過在Asp.net中使用MVC模式,可以構(gòu)建,具有良好擴(kuò)展性的Web應(yīng)用。MVC構(gòu)架可以輕松實現(xiàn)以下功能:
①實現(xiàn)一個模型的多個視圖;
②采用多個控制器;
③當(dāng)模型改變時,所有視圖將自動刷新;
④所有的控制器將相互獨立工作。
這就是MVC模式的好處,只需在以前的程序上稍作修改或增加新的類,即可輕松增加許多程序功能。以前開發(fā)的許多類可以重用,而程序結(jié)構(gòu)根本不再需要改 變,各類之間相互獨立,便于團(tuán)體開發(fā),提高開發(fā)效率。下面討論如何實現(xiàn)一個模型、兩個視圖和一個控制器的程序。其中模型類及視圖類根本不需要改變,與前面的完全一樣,這就是面向?qū)ο缶幊痰暮锰帯τ诳刂破髦械念?#xff0c;只需要增加另一個視圖,并與模型發(fā)生關(guān)聯(lián)即可。該模式下視圖、控制器、模型三者之間的示意圖如圖3.5所示。
?
同樣也可以實現(xiàn)其它形式的MVC例如:一個模型、兩個視圖和兩個控制器。從上面可以看出,通過MVC模式實現(xiàn)的應(yīng)用程序具有極其良好的可擴(kuò)展性,是Asp.net面向?qū)ο缶幊痰奈磥矸较颉?/span>
?4 MVC架構(gòu)的優(yōu)點及不足
4.1 MVC的優(yōu)點
MVC的優(yōu)點體現(xiàn)在以下幾個方面:
(1) 有利于團(tuán)隊開發(fā)分工協(xié)作和質(zhì)量控制,降低開發(fā)成本。
(2)?可以為一個模型在運行時同時建立和使用多個視圖。變化-傳播機(jī)制可以確保所有相關(guān)的視圖及時得到模型數(shù)據(jù)變化,從而使所有關(guān)聯(lián)的視圖和控制器做到行為同步。
(3)?視圖與控制器的可接插性,允許更換視圖和控制器對象,而且可以根據(jù)需求動態(tài)的打開或關(guān)閉、甚至在運行期間進(jìn)行對象替換。
(4)?模型的可移植性。因為模型是獨立于視圖的,所以可以把一個模型獨立地移植到新的平臺工作。需要做的只是在新平臺上對視圖和控制器進(jìn)行新的修改。
(5)?潛在的框架結(jié)構(gòu)??梢曰诖四P徒?yīng)用程序框架,不僅僅是用在設(shè)計界面的設(shè)計中。
4.2 MVC的缺點
MVC的不足體現(xiàn)在以下幾個方面:
(1)增加了系統(tǒng)結(jié)構(gòu)和實現(xiàn)的復(fù)雜性。對于簡單的界面,嚴(yán)格遵循MVC,使模型、視圖與控制器分離,會增加結(jié)構(gòu)的復(fù)雜性,并可能產(chǎn)生過多的更新操作,降低運行效率。
(2)視圖對模型數(shù)據(jù)的訪問效率低。視圖可能需要多次調(diào)用Model才能獲得足夠的顯示數(shù)據(jù)。
(3)完全理解MVC并不是很容易。使用MVC需要精心的計劃,由于它的內(nèi)部原理比較復(fù)雜,所以需要花費一些時間去思考。 同時由于模型和視圖要嚴(yán)格的分離,這樣也給調(diào)試應(yīng)用程序到來了一定的困難。
結(jié)束語
與軟件所處理問題的內(nèi)在模型相比較,用戶界面是需要經(jīng)常發(fā)生變化的,采用MVC設(shè)計模式可以在滿足對界面要求的同時,使軟件的計算模型獨立于界面的構(gòu)成。也可以基于此模型建立大型分布式應(yīng)用程序框架。
MVC并不適合小型甚至中等規(guī)模的應(yīng)用程序,花費大量時間將MVC應(yīng)用到規(guī)模并不是很大的應(yīng)用程序通常會得不償失。
MVC是一種軟件開發(fā)架構(gòu)。和其它設(shè)計模式一樣,它不是萬能的,也不是一成不變的。要根據(jù)具體情況靈活運用。在上面的示例項目中,為了提高運行和開發(fā)效率。在Model設(shè)計上就提供了兩種訪問方式。
示例中的MVC采用了集中控制的方式。一個列表控制器GridViewUIBase,對應(yīng)多個列表視圖。一個編輯控制器DialogUIBase對應(yīng)對個編輯、查看詳情視圖。對每個模型而言,僅有兩種視圖,且?guī)缀跏枪潭ú蛔兊?。所以沒有增加Observer(觀察者)模式。這樣減少了系統(tǒng)的復(fù)雜性。本示例最精彩的部分,就是控制器的設(shè)計。各視圖執(zhí)行流程完全封裝在控制器中。由于視圖中不含有任何控制信息,流程信息。所以視圖編碼人員完全不用了解Http的無狀態(tài)特性等。對他們而言,開發(fā)WebForm和WinForm是一樣的。當(dāng)然這種設(shè)計也有它的不足,如果修改某個視圖的顯示,有可能還要修改相關(guān)的控制器。
參考文獻(xiàn)
[1] (美)Alan Shallowly & James R.Trott.設(shè)計模式精解.[M].北京,清華大學(xué)出版社,2004,P:166-177,P:51-61
[2] 蘇曉明.基于MVC模式的石化企業(yè)生產(chǎn)模型構(gòu)造設(shè)計與實現(xiàn).[碩士論文].大連,大連理工大學(xué),20050618
[3] 蔡旸.基于MVC設(shè)計模式的協(xié)同設(shè)計系統(tǒng)的研究與實現(xiàn).[碩士論文].成都,西南交通大學(xué),20050601
[4] 林常須.多客戶端MVC設(shè)計模式的研究與應(yīng)用.[碩士論文].蘭州,蘭州理工大學(xué),20050501
致謝
?
值此論文完成之際,我衷心感謝王莉老師的悉心指導(dǎo)和無私幫助;感謝“成都微軟技術(shù)中心”給我難得的實習(xí)機(jī)會;感謝“成都市信息化資產(chǎn)管理系統(tǒng)”項目組的全體同事,給我?guī)椭椭笇?dǎo)
轉(zhuǎn)載于:https://www.cnblogs.com/xiaowy/archive/2006/06/22/432782.html
總結(jié)
以上是生活随笔為你收集整理的MVC架构在Asp.net中的应用和实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 天气转热
- 下一篇: (收藏)Turbo C 2.0、Borl