鐘志東 孟清
摘 要: 網站項目設計一般根據項目規模、安全要求和團隊工作方式等分別采用不同層次的設計構架,常用的構架有二層模型和三層模型。文章通過ASP.NET4.0(C#)介紹五層構架模塊化網站設計方法。從系統的安全性和技術層面把系統橫向分解為五層構架模式,再從業務功能考慮把系統縱向分塊,使得技術層次更加分明,模塊耦合度更低,模塊可重用性更高。五層構架模塊化設計把業務邏輯和數據庫嚴格與界面分開,系統安全得到保障,這是網站項目開發的理想構架模型。
關鍵詞: 網站項目設計; 五層構架; 模塊耦合度; 可重用性; 系統安全
中圖分類號:TP311 文獻標志碼:A 文章編號:1006-8228(2013)08-19-03
0 引言
在ASP.NET網站項目設計中,常用的系統構架模式為二層架構和三層架構[1],如圖1和圖2所示。安全性要求比較高的系統項目一般都基于三層架構方式開發。
圖1的開發模式只適應于SQLServer數據庫的開發,在這種模式中直接通過界面層的數據綁定控件調用SqlDataSource數據源,再由數據源建立數據庫連接,并直接執行數據庫的查詢語句或存儲過程來操作數據庫的數據(即增、刪、改和檢索操作),編程比較簡潔。其缺點是完全依賴于SQLServer數據庫,直接在界面層執行查詢語句系統安全性較差,也不利于團隊開發的分工協作。這種模式只適應于小型項目的開發。
圖2的開發模式由界面層的數據綁定控件直接調用業務實體類。這種模式雖然比使用SqlDataSource數據源模式復雜得多,但其具有很大的靈活性,它結合ADO.NET技術實現對來自不同的數據庫或數據文件的數據進行處理,在團隊開發的項目中被普遍采用。
三層構架的擴展如圖3所示[2],把中間邏輯層進一步拆分為三層,構成五層構架模式。五層構架模型從系統安全和技術層面把業務邏輯層進一步拆分為數據傳遞層、數據轉換層和執行查詢語句對象層,把業務邏輯嚴格與用戶界面隔離開來,以保障業務邏輯和數據的安全性。再從業務功能出發橫向分割,使系統更加細化、模塊化和標準化。把軟件開發過程設計成標準的組裝作業流程,技術層次分明,利于團隊各個技術能力層次的分工協作。第一層次由掌握網頁前端技術的技術人員承擔,第二層次可由初級程序人員承擔,第三層次由比較有經驗的高級程序人員承擔,第四層次可引用標準的ADO.NET技術封裝靜態類,第五層次由比較有經驗的數據庫技術人員承擔。
本文通過一個供應鏈管理信息系統項目的開發過程來展現五層構架模式的設計方法和技術特點。五層構架設計一般按照業務功能劃分模塊,在同一業務模塊再按構架層次劃分模塊,對整個系統功能從縱向和橫向進行切割。
1 用戶界面設計
用戶界面網頁的樣式和布局等技術這里不作介紹,著重介紹網頁文件的數據提交和接受的技術方法[3-4]。圖4所示是一個采購單的輸入界面,當采購單明細信息的商品數量輸入并回車時將顯示輸入的所有明細數據記錄,單擊 “確認”按鈕則生成一張采購單。
給出本網頁的部分代碼如下:
//實例化采購功能的數據傳遞類
ESCM.BLL.PurchaseManage bll=new ESCM.BLL.PurchaseManage();
//實例化采購功能的屬性類
ESCM.Model.PurchaseManage model=new
ESCM.Model.PurchaseManage ();
//GridView數據綁定
int editIndex=-1;
//執行DBAccess靜態分裝類的ExecuteScalar方法獲取臨時表的最大行記錄
object idno=DBAccess.ExecuteScalar(DBAccess.strConn,
CommandType.Text, "Select MAX(IdNo) From DetailTemp");
//獲取GridView編輯行
if (idno!=DBNull.Value) {
editIndex=Convert.ToInt32(idno)-1;
}
else {
//調用DBAccess靜態分裝類的ExecuteNonQuery方法,執行查詢語句,在臨時表中插入空記錄
DBAccess.ExecuteNonQuery(DBAccess.strConn,
CommandType.Text, "Insert Into DetailTemp(WareName)
Values('')");
editIndex=0;
}
//把臨時表記錄綁定到GridView并設置編輯行
gvDetailTemp.DataSource=DBAccess.ExecuteDataset
(DBAccess.strConn, CommandType.Text, "Select * From
DetailTemp");
gvDetailTemp.EditIndex=editIndex;
gvDetailTemp.DataBind();
//采購單添加按鈕事件方法代碼,把界面輸入的數據傳遞給屬性類對象
model.SupplierNo=Convert.ToInt32(ddlSupplier.SelectedValue);
model.SupplierFormNo=tbSupplierFormNo.Text.ToString();
model.Buyer=tbBuyer.Text.ToString();
model.PayState=rbPayState.SelectedValue;
model.Maker=lbMaker.Text.ToString();
model.Remark=tbRemark.Text.ToString();
model.PurchaseDate=Convert.ToDateTime
(tbPurchaseDate.Text.ToString());
//執行接受數據對象的方法
bll.Add(model);
本段代碼展示了用戶界面如何傳遞和接受數據的過程。網頁事件方法通過數據控件把相關數據傳遞給數據傳遞層的model對象,而model對象則作為bll對象的參數。
2 數據傳遞層對象
在數據傳遞層中包含兩個用戶自定義類[5],一個是ESCM.Model.PurchaseManage類,這是一個屬性類,該類只包含屬性成員,屬性成員與采購管理功能模塊基礎數據表的字段相對應,其部分代碼如下:
namespace ESCM.Model
{ public class PurchaseManage
{ public int PurchaseNo {set; get;} //采購單編號
public string Buyer {set; get;} //采購員
public string Maker {set; get;} //制單人
public string PayState {set; get;} //付款狀態
public DateTime PurchaseDate {set; get;} //制單日期
public decimal PurchasePrice {set; get;} //訂購價
…… //其他方法省略
}
}
另一個ESCM.BLL.PurchaseManage類是數據傳遞類,通過屬性類對象作為方法參數傳遞數據,每個方法體只包含一條語句,即調用數據轉換對象的相應方法的語句。由它把用戶界面數據傳遞給數據轉換對象,其部分代碼如下:
namespace ESCM.BLL
{ public class PurchaseManagement
{ //實例化采購管理模塊功能的數據轉換類
ESCM.DAL.PurchaseManagement dal=new ESCM.DAL
.PurchaseManagement();
//增加采購單信息
public int Add(ESCM.Model.PurchaseManagement model)
{ return dal.Add(model);
}
…… //其他方法省略
}
}
3 數據轉換層對象
數據轉換層的任務是把用戶界面傳遞過來的數據轉換成數據庫查詢語句相匹配的參數,并指定要被執行的查詢語句。這一層次的對象還有另外一個重要的角色,就是要承擔數據庫存儲過程難于應對的復雜業務邏輯,如隊列管理等。其部分代碼如下:
namespace ESCM.DAL
{ public class PurchaseManagement
{ //增加采購單信息
public int Add(ESCM.Model.PurchaseManagement model)
{ //把model對象相關成員屬性轉換為Object數組元素
Object[] paramValures=new object[] { model.SupplierNo,
model.SupplierFormNo,
model.Buyer,
model.PayState,
model.Maker,
model.Remark,
model.PurchaseDate
};
//調用DBAccess靜態封裝類的ExecuteNonQuery方法執行存儲過程
object obj=DBAccess.ExecuteNonQuery (DBAccess
.strConn, "ProPurchaseFormAdd", paramValures);
}
…… //其他方法省略
}
}
4 執行查詢語句層對象
本層的對象是一個通過ADO.NET技術執行各種查詢語句的類,可設計為標準的靜態封裝類,被所有功能模塊引用,更進一步地被所有項目引用[6]。該類包含一系列的靜態重載方法來執行各種各樣的查詢語句。微軟提供了標準的封裝類文件sqlhelper.cs,可在網上下載,在此不作贅述。
也可在對安全性要求不高且重用性較低的編碼中,為了簡化編程,直接在界面層調用本封裝類,如本文網頁代碼中所給出的對臨時表的操作一樣。
5 數據庫設計
良好的數據庫設計其基本標準是基礎數據表盡可能避免重復字段,基礎數據表要建立必要的關聯約束和索引,用視圖組織查詢字段,用存儲過程實現數據的增、刪、改和檢索操作。
6 結束語
本文以商務網站系統中采購單信息輸入功能為例,探討了網站開發中的五層構架模塊化設計方法。只要掌握了本功能的設計,就可以此類推,掌握整個系統的五層構架模塊化設計方法。
五層構架模式是三層構架的擴展,在網站項目開發中具有如下突出的優點:
⑴ 代碼安全性比較高,具體的業務邏輯和數據處理遠離界面層,系統不易受到攻擊;
⑵ 構架層次與技術層次緊密相關,技術層次界線分明,比較易于開發團隊的各個技術層級的工作分工與協作;
⑶ 按技術層面和業務功能劃分模塊,系統耦合性比較低;
⑷ 代碼重用性比較高,設計的中間業務層類很容易引用到其他的類似項目中;
⑸ 類方法技巧的重用性比較高,在一個業務功能模塊比較好的設計方法可以直接引用到另一個功能模塊中;
⑹ 每個過程技術分明,關聯性明確,易于標準化設計。
五層構架模塊化系統設計不僅適用于網站項目的開發,也適用于所有管理信息系統項目的開發。
參考文獻:
[1] 戴上平,丁士鋒等.ASP.NET3.5完全自學手冊[M].機械工業出版社,2009.
[2] 鐘志東.趙中文等.ASP.NET 4(C#)項目開發教程——面向工作過程[M].北京航空航天大學出版社,2011.
[3] 溪江華.圣殿祭司的ASP.NET2.0開發詳解[M].電子工業出版社,2006.
[4] 馬偉.ASP.NET 4權威指南[M].機械工業出版社,2011.
[5] 周禮.C#和.NET3.0第一步[M].清華大學出版社,2008.
[6] 微軟.Sqlhelper類[DB/OL].百度百科.