于海霞 王昊
摘要:在解析ASP.NET三层构架具体概念的基础上,通过实例介绍ASP.NET三层构架的具体应用及各层的主要功能,为初学者更加了解ASP.NET三层构架提供理论参考。
关键词:ASP.NET;表示层;业务逻辑层;数据访问层
中图分类号:TP311 文献标识码:A 文章编号:1674-1161(2016)03-0038-02
1 ASP.NET三层构架概述
ASP.NET三层构架分别是表示层、业务逻辑层和数据访问层。表示层(USL)以WEB,WINFORM方式表示。如果逻辑层相当强大和完善,无论表现层如何定义和更改,逻辑层都能提供完善的服务。业务逻辑层(BLL)主要是针对具体问题的操作,也可以理解成对数据层操作,对数据业务进行逻辑处理。如果说数据层是积木,则逻辑层就是对积木进行搭建。数据访问层(DAL)主要是原始数据(数据库或者文本文件等存放数据形式)操作层,而不是指原始数据,为业务逻辑层或表示层提供数据服务。
简单的三层结构程序一般包括DAL,BLL,WEB,Model几个项目,它们的相互引用关系为:WEB引用BLL,Model;BLL引用DAL,Model;DAL引用Model;Model无引用。
为使用户实现简单管理,应先建立一个空白解决方案,然后添加如下项目及文:1) 添加ASP..NET Web Application项目,命名为UI,新建Web Form类型文件User.aspx(含User.aspx.cs)。2) 添加ClassLibrary项目,命名为BLL,新建Class类型文件UserBLL.cs。3) 添加ClassLibrary项目,命名为DAL,新建Class类型文件UserDAL.cs。添加SQLHelper引用(一般用自己写的数据访问类DataAccessHelper)。4) 添加ClassLibrary项目,命名为Model,新建Class类型文件UserModel.cs。5) 添加ClassLibrary项目,命名为IDAL,新建Interface类型文件IUserDAL.cs 6,添加ClassLibrary项目,并且命名为ClassFactory。
2 文件在各层的应用方法
2.1 User.aspx文件和User.aspx.cs文件都属于表现层
User.aspx更容易理解,因为它就是显示页面。一般情况下,User.aspx.cs不应在表现层,而应该属于业务逻辑层。但如果不进行具体分层,User.aspx.cs处理业务归属逻辑层乃至操作数据库都可以;但如果进行分层,则应在分层结构中,User.aspx.cs只会处置与显示有关的部分,其它内容不应触及。
若要实现用列表方式显示用户的功能,则提取信息工作由BLL完成。UI(本例中是User.aspx.cs)调用BLL得到UserInfo后,通过代码绑定到User.aspx数据控件上,实现列表表现。在此过程中,User.aspx.cs对UI不起主要作用,只是用来传递数据。由于现实编码大多采用此方法实现,因此感觉User.aspx.cs不应该属于UI,而是应该并入BLL负责逻辑处理。这就提出一个新要求,在每个用户前面加一个相应图标,直接表示出用户性别,其中不满18岁的用户用儿童图标表示。这个需求的实现,需要User.aspx.cs来完成。
2.2 NewBLL.cs添加方式
public IList GetUsers()public UserInfo GetUser(int UserId):返回指定用户的具体信息public bool AddUser(UserInfo User):新增用户信息public bool ChangeUser(UserInfo User):更新用户信息public void RemoveUser(int UserId):移除用户信息后,此文件属于营业逻辑层,专门用来处置与营业逻辑有关的操纵。
有很多人把表示层传过来的数据转发到数据层,说明项目较为简单或项目本身没有与业务紧密结合,导致业务层没有操作,只起到转发作用。但这不代表营业层无关紧要,随着项目增大或业务关系复杂化,业务层的作用将凸显。此外,很多人容易把数据操作代码划分到业务层,并且把数据库作为数据访问层,造成错误。例如,有些人觉得BLL层意义不大,将DAL的数据提上来处未作任何处理就转发给UI。BLL层SelectUser(UserInfo userInfo)根据传入的username或email得到用户详细信息;IsExist(UserInfo userInfo)判断指定的username或email是否存在;然后,DAL相应提供方法供BLL调用SelectUser(UserInfo userInfo)IsExist(UserInfo userInfo),这样BLL确实只起传递作用。但如果这样做,BLL.IsExist(Userinfo userinfo) { UerInfo user = DAL.SelectUser(User);return (userInfo.Id != null); },DAL无法实现IsExist()方法,BLL中有逻辑处理代码。
2.3 UserModel.cs实体
Model在三层架构中的位置和int,string等变量一样,只用于数据存储,但它存储比较复杂的数据。所以,若项目中都是比较简单的对象,则不用model,直接传递参数也可以做三层架构。
现举例说明model在各层参数传递中的作用。在各层间传递参数时,可以设置为AddUser(userId,userName,userPassword,…,),也可以设置为AddUser(userInfo),但第二种方法更好。
应用model和普通变量时,SelectUser(int UserId)SelectUserByName(string username)SelectUserByName(string username,string password)SelectUserByEmail(string email)SelectUserByEmail(string email,string password),可以概括为SelectUser(userId) SelectUser(user)。这里用user的Model工具包括username,password,email这3个参数的4种组合模式。UserId也可以合并到user中,但项目中别的BLL都实现id参数接口,故也留下这项。
传入userInfo的处理,需要依照前后次序用详细代码决定。UserDALcs public IList SelectUsers():返回全部的用户信息列表public UserInfo SelectUser(int UserId):返回指定用户的信息 public bool InsertUser(UserInfo User):新增用户信息public bool UpdateUser(UserInfo User):更新用户信息public void DeleteUser(int UserId):移除用户信息 。
许多人对数据访问层比较迷糊:有一部分人不清楚定义,认为数据库是访问层,其实DAL是数据访问层,而不是数据存储层,故数据库不是这一层的;也有人把SQLHelper(或其同类作用组件)作为数据访问层。SQLHelper的作用是削减重复性编码,提高编码效率,所以在注重效率或利用非数据库数据源时,可以抛弃SQLHelper。和数据源操作相对应的代码,属于数据访问层。
此外,能够另一个判断三层架构是否标准的方法就是,改变三层架构中任何一层时,是否会影响其它两层。例如:把项目从C/S改成B/S(或相反),这样除UI之外,BLL与DAL都不需要改变。