钟志东 孟清
摘 要: 网站项目设计一般根据项目规模、安全要求和团队工作方式等分别采用不同层次的设计构架,常用的构架有二层模型和三层模型。文章通过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].百度百科.