趙 偉,王志華,周 兵
(1.鄭州大學 軟件技術學院,河南 鄭州450002;2.河南省高等學校信息網絡重點開放實驗室,河南 鄭州450052)
隨著基于瀏覽器/服務器模式的WEB系統的日益普及,此類系統的可擴展性差、代碼復用率低等問題也屢見不鮮了,因此在軟件系統的開發生命周期中,選擇一個合適的軟件架構對于系統及其同構子系統是極其重要的因素[1]。目前采用 .NET框架技術開發成為開發WEB系統的主要選擇,首先是因為用戶的操作系統平臺大多都是Windows,再加上低廉的成本和微軟數據庫系統SQLSERVER無縫連接等原因讓.NET架構的應用越來越廣泛。其次應用.NET框架的N-層技術開發的軟件系統可以在一定程度上提高代碼復用率,并且使系統具有更強的應用性、開發性和擴展性的 優 勢[2]。
.NET的五層架構模式如圖1所示。
在該架構模式中,共分為五層,這五層從上到下依次為用戶界面層 (UI layer)、門面層 (Fa ade layer)、邏輯層(logic layer)和數據訪問層 (data access layer)以及數據存儲層 (data stored layer)。用戶界面層是由瀏覽器向系統提供訪問的用戶界面;門面層是依據門面模式的原理,為邏輯層和數據訪問層的全部調用提供一個統一的高層次的接口。邏輯層則實現了系統的具體業務規則并且解決系統功能的擴展性問題。而系統中數據的存取是通過數據訪問層來實現,數據訪問層是系統中數據交互的橋梁,該層不但通過存儲過程與下層的數據存儲層交互,而且以數據對象CSID(跨層調用標準接口數據集)的形式將數據返還給上層。

圖1 .NET的五層架構模式
目前流行的是.NET的經典的四層架構模式[3-4]。如圖2所示。

圖2 .NET的經典的四層架構模式
UI層,即用戶界面層 (user interface layer)是瀏覽器為應用程序提供訪問界面,這層主要是向用戶提供界面上的操作和實現各種頁面控件的事件處理。業務邏輯層(business logic layer)為用戶界面層提供對業務規則的統一調用接口。數據訪問層 (data access layer)為業務邏輯層提供數據服務。其功能主要是負責數據庫的訪問。具體就是實現對數據庫表的Select、Insert、Update、Delete的一些基本操作,結果可以返回數據集,每層主要是通過CSID實例的形式返回給上層。最后一層是DataBase,對數據進行封裝,并且與數據庫實體映射。
分N層結構實現網絡服務的方法目前在業界已經廣泛應用,所劃分的層次視具體應用而定,比較上述兩種業界廣泛采用的架構模式我們可以發現,兩者的區別主要體現在邏輯層和數據訪問層,UI層沒有發生變化,仍然是以頁面為中心的WEB模型,雖然對于小型WEB系統的開發開說,可以實現快速開發和一定程度的代碼復用,但是對于大型的業務邏輯復雜的系統的設計和維護就有一定的局限性了。再加上 “code-Behind”技術造成了用戶界面層與業務邏輯層的耦合度過高,不但導致頁面顯示和流程控制和的可分離性差,使其難以滿足復雜多變的用戶需求;而且也導致了頁面層與業務邏輯層的代碼復用率低。
現在很多的應用程序都可以基于MVC(model-view-controller)模式進行設計與實現[5-6],包括 Web應用程序框架。ASP.NET的架構模式也提供了對 MVC的實現機制[7-8],在ASP.NET的架構模式中,主要是其Page Controller模式來實現MVC模式,視圖由表示層的aspx文件實現,模式由上面所述架構中的業務邏輯層來實現,每個頁面都有一個控制器,沒有核心控制器[9]。該機制實現MVC模式具有簡單易用、頁面和控制器功能劃分清晰、頁面、控制器和業務邏輯層之間的耦合度較低等優點。但是同樣對于大型的復雜系統來說,由于缺少一個強大的核心控制器,無法合理有效地的統一控制,集成一個完整的系統。
綜上所述,本文以ASP.NET的多層架構技術為基礎,并對ASP.NET框架中的MVC實現機制進行擴展研究[10],提出一種新的MVC模式實現架構,論述其組成結構和運行機理,并以樣本選貨廳系統為例闡述說明各組成模塊的實現過程。
新的架構模式分為五層,從上到下依次是UI Layer、Control Layer、Business Layer、DataAccess Layer和數據庫(DataBase)。新的MVC架構模式圖如圖3所示。

圖3 基于.Net技術和MVC模式的新架構模式
在新的架構模式中,視圖就是頁面表示層 (UI layer),也就是我們Web應用的外觀顯示,為客戶端提供對應用程序的訪問界面,負責接收用戶的輸入、將輸出呈現給用戶。
控制層 (control layer),這層是相對于.NET經典的三層架構模式新加的一層,主要目的是連接模式層和UI層,是模式層和UI層之間的橋梁。該層主要由自定義PageBase類、Parameter類以及系統日志記錄組成。自定義PageBase類,繼承了System.Web.UI.Page類,并且將各種初始化和控制函數重新封裝,以滿足MVC模式中的核心控制器的要求。系統的所有頁面都繼承自定義的PageBase類,所有符合要求的用戶請求都要先轉發到該類進行處理,再由該類分發給各個頁面的Page Controller進行處理。Parameter類是用來保存每張畫面的數據,并向模式層部分中的業務邏輯層的Facade類傳遞數據對象的類,所以與視圖層中的每張頁面一一對應。另外我們也可以利用控制層來記錄系統的操作日志。
模式層由兩層組成,一層是Business Layer即業務邏輯層,另一層是DataAccess Layer即數據訪問層。業務邏輯層,一般在該層中進行業務邏輯的處理,業務邏輯層通過CSID的形式與數據訪問層、控制層進行交互,業務邏輯層的設計是整個系統設計中的關鍵問題。業務邏輯層中核心部分是Facade類,負責完成與具體業務密切相關的業務邏輯處理。數據訪問層,該層主要是向業務邏輯層提供數據服務,具體在該架構模式中,它包括三部分:第一部分是數據實體DataSet類,該類的作用是以強類型的Dateset在各層之間傳遞數據信息。當數據庫中的表的結構等如果發生改變時,只需要對數據訪問層的代碼進行修改就可以了,不需要再修改其它的地方。第二部分是數據源訪問管理類DBManager,由于數據訪問層用于存放應用應用系統的數據信息,一般采用關系型數據庫進行存儲,所以DBManage類屏蔽了系統對DBMS的依賴性,利用DBManage類可以與來自SQLServer、Oracle、DB2等不同的數據庫相連,第三部分是數據訪問操作類DAO類,它將對數據表的Select、Insert、Update、Delete的一些基本操作封裝在DAO類中。
新架構的時序圖如圖4所示。用戶需要視圖層顯示相關信息,通過HandleEvent事件傳遞到控制層,控制層先對畫面的數據進行封裝,封裝后調用模式層中Fa?ade中的方法,并通過模式層中DAO和數據庫發生交互,將查詢的結果以DATASET的形式傳遞到控制層,控制層將數據封裝后,根據用戶的需求最終顯示畫面并通知用戶。
圖書樣本選貨廳系統架構如圖5所示。
本文以某書店的圖書樣本選貨廳系統為例進行說明,該系統主要是實現客戶在進入倉庫的前提下,通過RF終端掃描圖書樣本的條形碼,下采購訂單,倉庫接收到訂單信息后,快速準確的配貨并最終發貨??蛻艨梢詫τ唵沃械男畔⑦M行查看、添加、修改和刪除操作。該系統主要有訂單管理模塊、樣本管理模塊、財務管理模塊、基礎數據管理4個模塊組成。該系統在實際編程中使用了Microsoft.NET平臺和ASP.NET技術,后臺數據庫采用Microsoft SQL Server 2005作為數據庫服務器,客戶瀏覽器使用Microsoft Internet Explorer。
樣本選貨廳系統的架構圖包括五層,自頂向下分別為UI Layer、Control Layer、Business Layer、DataAccessLayer和數據庫Microsoft SQL Server 2005。其中UI Layer的數據來源于兩個途徑:Form和Device,主要是針對樣本選貨廳系統特殊的業務流程而言的,樣本選貨廳里客戶下訂單是通過RF終端掃描圖書樣本的條碼和輸入的數量來生成訂單的,所以就在最上面是系統的數據來源Device和Form Screen。Control Layer根據UI Layer得到的數據控制頁面間的流轉以及最終的VIEW顯示,同時還有PageBase類和Parameter類。Business Layer是負責系統業務邏輯的處理,而DataAccess Layer包括三部分一部分是DAO類,該類封裝了對數據庫的操作行為,另外一部分是DATASET類,該類對應于系統的數據庫中的所有表結構,最后一部分是Dbmanager類,負責理對數據源的連接服務。下文結合圖書樣本選貨廳系統中的圖書樣本查詢功能來說明新框架中各個部分的具體實現方法。

圖4 新架構的時序圖

圖5 圖書樣本選貨廳系統架構
視圖層的實現是依據客戶需求構建aspx頁面的過程。
3.3.1 PageBase類的實現
PageBase繼 續 于 System.Web.UI.Page類,其 中 的PageLoad()是頁面初始化的重要事件,同時PageLoad()是該系統自動的核心控制器,由它來統一處理用戶請求,除了初始化頁面的一些基本代碼由系統自動產生,我們根據最終顯示的要求,通過SetDocumentTitle(),Set-MultiLanguage ( ), ProcessControlsWithStatus ( ),SetValue-ForDataControls(),GridView ()等方法來分別控制畫面最終的顯示結果。SetDocumentTitle()用于控制顯示畫面的標題,最終顯示在IE瀏覽器的Title欄中。Set-MultiLanguage()設置畫面中相關需要表示為多語言的控件的多語言屬性。ProcessControlsWithStatus()根據畫面狀態,設置畫面上的控件的狀態。例如:控件是否可以被編輯或者控件是否可見等狀態。SetValueForDataControls()根據Parameter設置畫面上控件的值。如果控件只需要設置一次值,如:列表類控件 (DropDownList,ListBox等)的數據綁定,則應該在Not IsPostBack代碼塊中進行處理。GridView ()綁定到DataTable,通過GirdView控件的形式在頁面中顯示數據。
3.3.2 Parameter類的實現
由于Parameter類中的數據與頁面中的數據也是一一對應的,下文以圖書樣本的查詢畫面為例來說明Parameter類具體的實現方法。圖書樣本的查詢畫面中有3個檢索條件,分別是ISBN、書名和出版社。該畫面對應的Parameter類的代碼如下所示:
public class ParameterT01A{
#region fields,properties
private string _BookNo;
public string BookNo
{ get{return _BookNo;} set{_BookNo=value;} }
private string _Book Name;
public string BookName
{ get{return _Book Name;} set{_Book Name=value;} }
……
#endregion fields,properties}
將畫面中的數據通過Parameter類的形式進行封裝,并且用Parameter作為參數,傳遞到業務邏輯層的fa ade類,最后進行數據的查詢,并最終將查詢的結果以Parameter類的形式傳遞回畫面,顯示給用戶。這樣做最大的一個優點就是極大地提高了系統的可擴展性和提高代碼的復用率。因為如果將畫面由WebPage換成Winform,不需要修改業務邏輯層的Facade類,只需要修改Winform中的Parameter類。
3.4.1 業務邏輯層
public ParameterT01CSearchBooks(ParameterT01A t01a)
{//實例化一個BookDAO對象,并連接數據源
BookDAO daobook=new BookDAO (dbman)
//調用BookDAO中的方法Query根據條件在數據庫中查詢結果。
DataSetBook.BookDataTable bookTable = daobook.Query (t01aBookNo,t01a.BookName,t01aPublishinghouse);
//查詢后的結果綁定于gridview并顯示
t01a.GridViewDataSource=bookTable;
//關閉數據源連接
dbMan.Close ();
//返回parameter類的實例化對象t01a;
return t01a;}
3.4.2 數據訪問層
3.4.2.1 數據實體DataSet類
在.net環境下,DataSet類是對數據庫表的抽象,包括與數據庫表字段相對應且名稱一致的成員變量以及設置、讀取變量值的set和get方法等。本項目中使用的是定制的DataSet,其優點是可以按照客戶具體的業務需求自定義DataSet,有助于從面向對象的角度實現該系統。和其它使用ASP.NET進行數據庫信息系統開發不同的是,我們的Dataset是一些通過Visual Studio設計器自動產生的,通過拖放操作來生成Dataset類,并通過設計相應的屬性來滿足我們的需要。我們在該系統開發中使用數據庫時,數據一般被表示成不同的實體,如Book、Customers等。為了和這些數據一起工作,需要將它們以實體的形式封裝。如可以為每個實體寫一個定制的類。當然,為了方便處理實體對象,自定制DataSet中的字段可以是和數據庫中的某個表字段一一對應,也可以是對數據庫中的多個表中的字段的抽象重新組合,甚至一個數據集中可以包涵多個數據庫表對象。通過Visual Studio設計器自動產生的Dataset,在該項目中我們可以非常輕松地對數據進行增刪改操作。從本質上講,我們創建了一個Dataset,就相當于創建了一個自定義的類。這和我們手工寫的類一樣,所不同的是,這是使用可視化的設計器來完成的。同時這個Dataset會和數據庫的schema保持同步。而Visual Studio的代碼產生器將為我們完成所有的底層操作。另外,由于這些Dataset從ADO.NET的相應類型繼承,因此,它們可以繼承豐富的數據操作功能,同時這些功能還和ASP.NET的數據綁定相結合使用,極大的減少了手工寫代碼的工作量,提高了開發效率和開發進度。
3.4.2.2 數據源訪問管理類 DBManager
在該系統中通過DBManager.cs類來管理對數據源的連接服務。在DBManager.cs中有一個方法getConnection,作用是得到連接字符串。
public static SqlConnection getConnection()
{//聲明連接字符串
String settings;
//使用用SqlConnection連接數據庫
SqlConnection connection;
//從Config文件中讀取連接字符串
settings = DAL.Properties.Settings.Default.testConnectionString;
String connectionString=settings;
connection=new SqlConnection
(connectionString); }
3.4.2.3 數據訪問類DAO類的實現
我們對數據表的Select、Insert、Update、Delete的一些基本操作封裝在DAO類中。例如:表查詢操作。
public static DataSetBook.BookDataTable Query
(string bno,string bname,string bpublishinghouse)
{ SqlCommand selectCommand=new System.Data.SqlClient.SqlCommand ();
selectCommand.Connection=conn;
selectCommand.Transaction = transaction;
selectCommand.CommandText= @"SELECT *
FROM book where BooNo LIKE Bno and BookName LIKE bname and Publishinghouse LIKE bpublishinghouse";
selectCommand.CommandType =System.Data.CommandType.Text;
DataSetBook BookDataTable table=new BookDataSet.BookDataTable ();
new SqlDataAdapter (selectCommand).Fill(table);
return table; }
3.4.2.4 具體實現步驟
(1)設置數據源訪問字符串。
<connectionStrings>
<add name="BookConnectionString"connection-String="Data Source=192.168.0.210;Initial Catalog=book;Persist Security Info=True;User ID=sa;Pass word=sa"providerName="System.Data.SqlClient"/>
</connectionStrings>
(2)得到數據源訪問字符串,.打開數據源連接,進行數據庫的查詢操作,最后關閉數據源連接。
//通過DBManager類中的getConnection得到數據源訪問字符串。
SqlConnection conn=getConnection ();
//打開數據源連接
conn.Open ();
//進行數據庫的查詢操作。
SqlTransaction transaction=conn.BeginTransaction ();
//調用BookDAO中的方法Query根據條件在數據庫中查詢結果。
DataSetBook.BookDataTable bookTable = daobook.Query (BookNo,BookName,Publishinghouse);
transaction.Commit();
//關閉數據源連接。
conn.Close ();
MVC模式在目前是一種應用比較普遍的設計模式,本文提出新的模式融合MVC的設計思想和.NET架構模式的優點,并成功地將此種架構模式應用于樣本選貨廳系統的架構設計中,通過項目實踐證明該架構模式更加明確了各個層次的職責,大大減少了各個層次之間的藕合度,同時也提高了系統的可擴展性和系統的可移植性,新架構模式比較適合大型的以及業務邏輯復雜的系統,為其它具有同種結構的應用系統的研發提供了一定的參考。
[1]Shaw M,Clements P.The golden age of software architecture[J].IEEE Software,2006,23 (2):31-39.
[2]ZHU Chuanbao,LI Congdong.Information management system of electric power capital construction based on.Net platform [J].Computer Engineering,2006,32 (14):255-257(in Chinese).[朱傳寶,李從東.基于.Net平臺的電力基建信息管理系統 [J].計算機工程,2006,32 (14):255-257.]
[3]LUO Jing.Comment on N tier architecture based on.Net [J].Computer Engineering and Design,2006,27 (18):3467-3469(in Chinese). [羅靜.基于 .NET的 N層體系結構的探討[J].計算機工程與設計,2006,27 (18):3467-3469.]
[4] WANG Wen-fa,MA Yan,LI Hong-da.Four-tier structure based on.NET and its application in integrated information system [J].Computer Engineering and Design,2009,30 (4):912-914(in Chinese).[王文發,馬燕,李紅達.基于.NET的四層結構及其在綜合信息系統中的應用 [J].計算機工程與設計,2009,30 (4):912-914.]
[5]LIU Ning,LU Rongguo,MIU Wansheng.Continuous software abstracting evolution from MVC architecture pattern to MVC architecture framework [J].Computer Engineering,2008,34 (4):107-110 (in Chinese). [劉寧,陸榮國,繆萬勝.MVC體系架構從模式到框架的持續抽象進化 [J].計算機工程,2008,34 (4):107-110.]
[6]SUN Zhao-yun,SUN Xiang-ke,SHA Ai-min.Design and implementation of teaching and management systems based on MVC [J].Computer Engineering and Design,2009,30(23):5541-5543 (in Chinese). [孫朝云,孫向科,沙愛民.基于MVC架構網絡教學管理系統的設計與實現 [J].計算機工程與設計,2009,30 (23):5541-5543.]
[7]GONG Wei-hua,WANG Chen-guang,YU Huan-jun.Design of company management information system based on MVC and.NET [J].Computer Engineering and Design,2007,28(9):2142-2144 (in Chinese).[龔薇華,王晨光,俞歡軍.基于MVC模式和.NET的公司內部管理信息系統設計 [J].計算機工程與設計,2007,28 (9):2142-2144.]
[8]LI Yuan,CHEN Shi-ping.Application of MVC design pattern in ASP.NET [J].Computer Engineering and Design,2009,30 (13):3180-3184 (in Chinese). [李園,陳世平.MVC設計模式在ASP.NET平臺中的應用 [J].計算機工程與設計,2009,30 (13):3180-3184.]
[9]Shams Mukhtar.Applying robustness analysis on the modelview-controller(MVC)architecture in ASP.NET framework,using UML",available [EB/OL ] .http://www.cod,eproject.comL/aspnet/ModelViewController.asp,accessed,2006.
[10]WANG Ya-lin,ZHOU Ying,LEI You-cheng,et al.Shunting trip plan assistant making system based on MVC [J].Computer Engineering,2010,36 (21):257-259 (in Chinese).[王雅琳,周穎,雷友誠,等.基于MVC的調車作業計劃輔助編制系統[J].計算機工程,2010,36 (21):257-259.]