《三层架构的理解.pdf》由会员分享,可在线阅读,更多相关《三层架构的理解.pdf(8页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、三层架构的理解三层架构的理解三层架构的理解三层架构的理解了解了解c#c#中的三层架构中的三层架构(DAL,BLL,UI(DAL,BLL,UI一提三层架构一提三层架构,大家都知道是表现层大家都知道是表现层(UI,(UI,业务业务逻辑层逻辑层(BLL(BLL和数据访问层和数据访问层(DAL,(DAL,而且每层如何细分也都有很多的方法。但具体代而且每层如何细分也都有很多的方法。但具体代码怎么写码怎么写,到底那些文件算在哪一层到底那些文件算在哪一层,却是模模糊糊的。下面用一个简单的例子来带却是模模糊糊的。下面用一个简单的例子来带领大家实战三层架构的项目领大家实战三层架构的项目,这个例子只有一个功能这个
2、例子只有一个功能,就是用户的简单管理。就是用户的简单管理。首先建立一个空白解决方案首先建立一个空白解决方案,添加如下项目及文件添加如下项目及文件1 1、添加、添加ASP.NET Web ApplicationASP.NET Web Application项目项目,命名为命名为UI,UI,新建新建WebWebFormForm类型文件类型文件User.aspx(User.aspx(含含User.aspx.csUser.aspx.cs2 2、添加、添加ClassLibraryClassLibrary项目项目,命名为命名为BLL,BLL,新建新建ClassClass类型文件类型文件UserBLL.cs
3、UserBLL.cs3 3、添加、添加ClassLibraryClassLibrary项目项目,命名为命名为DAL,DAL,新建新建ClassClass类型文件类型文件UserDAL.csUserDAL.cs。添加。添加S SQLHelperQLHelper引用。引用。(这个是微软的数据访问类这个是微软的数据访问类,也可以不用也可以不用,直接编写所有的数据访问直接编写所有的数据访问代码。我一般用自己写的数据访问类代码。我一般用自己写的数据访问类DataAccessHelperDataAccessHelper。4 4、添加、添加ClassLibraryClassLibrary项目项目,命名为命名
4、为Model,Model,新建新建ClassClass类型文件类型文件UserModel.csUserModel.cs5 5、添加、添加ClassLibraryClassLibrary项目项目,命名为命名为IDAL,IDAL,新建新建InterfaceInterface类型文件类型文件IUserDAL.csIUserDAL.cs6 6、添加、添加ClassLibraryClassLibrary项目项目,命名为命名为ClassFactoryClassFactory相信大家已经看出来了相信大家已经看出来了,这个和这个和PetshopPetshop的示例没什么区别的示例没什么区别,而且更简单而且更简
5、单,因为在因为在下也是通过下也是通过PetshopPetshop学习三层架构的。但一些朋友对于这几个项目所处的层次学习三层架构的。但一些朋友对于这几个项目所处的层次,以及以及它们之间的关系它们之间的关系,可能比较模糊可能比较模糊,这里逐个说明一下这里逐个说明一下:1 1、User.aspxUser.aspx和和User.aspx.csUser.aspx.cs这两个文件这两个文件(以及文件所属的项目以及文件所属的项目,下面也是如此下面也是如此,不再重复强调了都属于表现层不再重复强调了都属于表现层部分。部分。User.aspxUser.aspx比较好理解比较好理解,因为它就是显示页面了。因为它就是
6、显示页面了。User.aspx.csUser.aspx.cs有些人觉得不应该算有些人觉得不应该算,而是要划到而是要划到业务逻辑层中去。如果不做分层的话业务逻辑层中去。如果不做分层的话,那么让那么让User.aspx.csUser.aspx.cs来处理业务逻辑来处理业务逻辑,甚至操作甚至操作数据库都没什么问题数据库都没什么问题,但是做分层的话但是做分层的话,这样就不应该了。在分层结构中这样就不应该了。在分层结构中,User.aspx.c,User.aspx.cs s仅应该处理与显示有关的内容仅应该处理与显示有关的内容,其它部分都不应该涉及。其它部分都不应该涉及。举例举例:我们实现用列表方式显示用
7、户的功能我们实现用列表方式显示用户的功能,那么提取信息的工作是由那么提取信息的工作是由BLLBLL来做来做的的,UI(,UI(本例中是本例中是User.aspx.csUser.aspx.cs调用调用BLLBLL得到得到UserInfoUserInfo后后,通过代码绑定到通过代码绑定到User.aspxUser.aspx的的数据控件上数据控件上,就实现了列表的显示。在此过程中就实现了列表的显示。在此过程中User.aspx.csUser.aspx.cs对对UIUI没有起到什么作用没有起到什么作用,仅是用来传递数据仅是用来传递数据,而且因为实际编码中大部分情况都是如此的实现而且因为实际编码中大部分
8、情况都是如此的实现,所以使有些人所以使有些人觉得觉得User.aspx.csUser.aspx.cs不应该算不应该算UI,UI,而应该并入而应该并入BLLBLL负责逻辑处理。继续往下看负责逻辑处理。继续往下看,这时提出这时提出了一个新需求了一个新需求,要求在每个用户的前面加一个图标要求在每个用户的前面加一个图标,生动地表现出用户的性别生动地表现出用户的性别,而且不而且不满满1818岁的用儿童图标表示。这个需求的实现岁的用儿童图标表示。这个需求的实现,就轮到就轮到User.aspx.csUser.aspx.cs来做了来做了,这种情况下这种情况下User.aspx.csUser.aspx.cs才算
9、有了真正的用途。才算有了真正的用途。2 2、NewBLL.csNewBLL.cs添加如下方法添加如下方法:public IList GetUsers(:public IList GetUsers(:返回所有的用户信息列表返回所有的用户信息列表public UserInfo GetUser(int UserId:public UserInfo GetUser(int UserId:返回指定用户的详返回指定用户的详细信息细信息public bool AddUser(UserInfo User:public bool AddUser(UserInfo User:新增用户信息新增用户信息public
10、bool ChangeUser(UserInfo User:public bool ChangeUser(UserInfo User:更新用户信息更新用户信息public void RemoveUser(int UserId:public void RemoveUser(int UserId:移除用户信息移除用户信息此文件就属于业务逻辑层了此文件就属于业务逻辑层了,专门用来处理与业务逻辑有关的操作。可能有很专门用来处理与业务逻辑有关的操作。可能有很多人觉得这一层唯一的用途多人觉得这一层唯一的用途,就是把表现层传过来的数据转发给数据层。这种情况就是把表现层传过来的数据转发给数据层。这种情况确实很
11、多确实很多,但这只能说明项目比较简单但这只能说明项目比较简单,或者项目本身与业务的关系结合的不紧密或者项目本身与业务的关系结合的不紧密(比比如当前比较流行的如当前比较流行的MIS,MIS,所以造成业务层无事可做所以造成业务层无事可做,只起到了一个转发的作用。但这只起到了一个转发的作用。但这不代表业务层可有可无不代表业务层可有可无,随着项目的增大随着项目的增大,或者业务关系比较多或者业务关系比较多,业务层就会体现出它业务层就会体现出它的作用来了。的作用来了。此处最可能造成错误的此处最可能造成错误的,就是把数据操作代码划在了业务逻辑层就是把数据操作代码划在了业务逻辑层,而把数据库作而把数据库作为了
12、数据访问层。举例为了数据访问层。举例:有些朋友感觉有些朋友感觉BLLBLL层意义不大层意义不大,只是将只是将DALDAL的数据提上来就的数据提上来就转发给了转发给了UI,UI,而未作任何处理。看一下这个例子而未作任何处理。看一下这个例子BLLBLL层层SelectUser(UserInfo userInfoSelectUser(UserInfo userInfo根据传入的根据传入的usernameusername或或emailemail得到用户详细信息。得到用户详细信息。IsExist(UserInfo userInfoIsExist(UserInfo userInfo判断指定的判断指定的us
13、ernameusername或或emailemail是否存在。是否存在。然后然后DALDAL也相应提供方法共也相应提供方法共BLLBLL调用调用SelectUser(UserInfo userInfoSelectUser(UserInfo userInfoIsExist(UserInfo userInfoIsExist(UserInfo userInfo这样这样BLLBLL确实只起到了一个传递的作用。确实只起到了一个传递的作用。但如果这样做但如果这样做:BLL.IsExist(Userinfo userinfoBLL.IsExist(Userinfo userinfo UerInfo user
14、=DAL.SelectUser(User;UerInfo user=DAL.SelectUser(User;return(userInfo.Id!=null;return(userInfo.Id!=null;那么那么DALDAL就无需实现就无需实现IsExist(IsExist(方法了方法了,BLL,BLL中也就有了逻辑处理的代码。中也就有了逻辑处理的代码。3 3、UserModel.csUserModel.cs实体类实体类,这个东西这个东西,大家可能觉得不好分层。包括我以前在内大家可能觉得不好分层。包括我以前在内,是这样理解的是这样理解的:UI?:UI?Model?Model?BLL?BLL
15、?Model?Model?DAL,DAL,如此则认为如此则认为ModelModel在各层之间起到了一个数据传输在各层之间起到了一个数据传输的桥梁作用。不过在这里的桥梁作用。不过在这里,我们不是把事情想简单我们不是把事情想简单,而是想复杂了。而是想复杂了。ModelModel是什么是什么?它什么也不是它什么也不是!它在三层架构中是可有可无的。它其实就是面向它在三层架构中是可有可无的。它其实就是面向对象编程中最基本的东西对象编程中最基本的东西:类。一个桌子是一个类类。一个桌子是一个类,一条新闻也是一个类一条新闻也是一个类,int,int、stringstring、doubliedoublie等也是
16、类等也是类,它仅仅是一个类而已。它仅仅是一个类而已。这样这样,Model,Model在三层架构中的位置在三层架构中的位置,和和int,stringint,string等变量的地位就一样了等变量的地位就一样了,没有其它没有其它的目的的目的,仅用于数据的存储而已仅用于数据的存储而已,只不过它存储的是复杂的数据。所以如果你的项目只不过它存储的是复杂的数据。所以如果你的项目中对象都非常简单中对象都非常简单,那么不用那么不用ModelModel而直接传递多个参数也能做成三层架构。而直接传递多个参数也能做成三层架构。那为什么还要有那为什么还要有ModelModel呢呢,它的好处是什么呢。下面是思考一个问题
17、时想到的它的好处是什么呢。下面是思考一个问题时想到的,插在这里插在这里:Model:Model在各层参数传递时到底能起到做大的作用在各层参数传递时到底能起到做大的作用?在各层间传递参数时在各层间传递参数时,可以这样可以这样:AddUserAddUser(userId,userName,userPassword,(userId,userName,userPassword,也可以这样也可以这样:AddUser(userInfoAddUser(userInfo这两种方法那个好呢。一目了然这两种方法那个好呢。一目了然,肯定是第二种要好很多。肯定是第二种要好很多。什么时候用普通变量类型什么时候用普通变量
18、类型(int,string,guid,double(int,string,guid,double在在各层之间传递参数各层之间传递参数,什么使用什么使用ModelModel传递传递?下面几个方法下面几个方法:SelectUser(int UserId:SelectUser(int UserIdSelectUserByName(string usernameSelectUserByName(string usernameSelectUserByName(string username,string passwordSelectUserByName(string username,string pa
19、sswordSelectUserByEmail(string emailSelectUserByEmail(string email很多人最闹不清的就是数据访问层很多人最闹不清的就是数据访问层,到底那部分才算数据访问层呢到底那部分才算数据访问层呢?有些认为数有些认为数据库就是数据访问层据库就是数据访问层,这是对定义没有搞清楚这是对定义没有搞清楚,DAL,DAL是数据访问层而不是数据存储层是数据访问层而不是数据存储层,因此数据库不可能是这一层的。也有的把因此数据库不可能是这一层的。也有的把SQLHelper(SQLHelper(或其同类作用的组件作为数或其同类作用的组件作为数据访问层据访问层,它
20、又是一个可有可无的东西它又是一个可有可无的东西,SQLHelper,SQLHelper的作用是减少重复性编码的作用是减少重复性编码,提高编提高编码效率码效率,因此如果我习惯在乎效率或使用一个非数据库的数据源时因此如果我习惯在乎效率或使用一个非数据库的数据源时,可以丢弃可以丢弃SQLHeSQLHelper,lper,一个可以随意弃置的部分一个可以随意弃置的部分,又怎么能成为三层架构中的一层呢。又怎么能成为三层架构中的一层呢。可以这样定义可以这样定义:与数据源操作有关的代码与数据源操作有关的代码,就应该放在数据访问层中就应该放在数据访问层中,属于数据访属于数据访问层问层5 5、IUserDALIU
21、serDAL数据访问层接口数据访问层接口,这又是一个可有可无的东西这又是一个可有可无的东西,因为因为PetshopPetshop中带了它和中带了它和ClassFacClassFactorytory类工厂类工厂,所以有些项目不论需不需要支持多数据源所以有些项目不论需不需要支持多数据源,都把这两个东西做了进来都把这两个东西做了进来,有有的甚至不建的甚至不建ClassFactoryClassFactory 而只建了而只建了IDAL,IDAL,然后然后“IUserDAL iUserDal=new“IUserDAL iUserDal=newUserDAL(;”,UserDAL(;”,不知意义何在。这就完
22、全是画虎不成反类犬了。不知意义何在。这就完全是画虎不成反类犬了。许多人在这里有一个误解许多人在这里有一个误解,那就是以为存在这样的关系那就是以为存在这样的关系:BLL?:BLL?IDAL?IDAL?DAL,DAL,认认为为IDALIDAL起到了起到了BLLBLL和和DALDAL之间的桥梁作用之间的桥梁作用,BLL,BLL是通过是通过IDALIDAL来调用来调用DALDAL的。但实际是即使你如此编码的。但实际是即使你如此编码:“IUserDAL iUserDal=:“IUserDAL iUserDal=ClassFacotry.CreateUserDAL(;”,ClassFacotry.Crea
23、teUserDAL(;”,那么在执行那么在执行“iUserDal.SelectUsers(”“iUserDal.SelectUsers(”时时,其实还是执其实还是执行的行的UserDALUserDAL实例实例,而不是而不是IUserDALIUserDAL实例实例,所所以以IDALIDAL在三层中的位置是与在三层中的位置是与DALDAL平级的关系。平级的关系。通过上面的介绍通过上面的介绍,基本上将三层架构的层次结构说明了。其实基本上将三层架构的层次结构说明了。其实,本人有一个判断本人有一个判断三层架构是否标准的方法三层架构是否标准的方法,那就是将三层中的任意一层完全替换那就是将三层中的任意一层完
24、全替换,都不会对其它两层都不会对其它两层造成影响造成影响,这样的构造基本就符合三层标准了这样的构造基本就符合三层标准了(虽然实现起来比较难虽然实现起来比较难_。例如如果。例如如果将项目从将项目从B/SB/S改为改为C/S(C/S(或相反或相反,那么除了那么除了UIUI以外以外,BLL,BLL与与DALDAL都不用改动都不用改动;或者将或者将SQLSQLServerServer改为改为Oracle,Oracle,只需替换只需替换SQLServerDALSQLServerDAL到到OracleDAL,OracleDAL,无需其它操作等等。本来想在文中加入一些具体的代码的无需其它操作等等。本来想在文
25、中加入一些具体的代码的,但感觉不但感觉不是很必要是很必要,如果大家觉得需要的话如果大家觉得需要的话,我再补充吧。我再补充吧。总结总结:不要因为某个层对你来说没用不要因为某个层对你来说没用,或者实现起来特别简单或者实现起来特别简单,就认为它没有必要就认为它没有必要,或者摒弃它或者摒弃它,或者挪作它用。只要进行了分层或者挪作它用。只要进行了分层,不管是几层不管是几层,每一层都要有明确的目每一层都要有明确的目的和功能实现的和功能实现,而不要被实际过程所左右而不要被实际过程所左右,造成同一类文件位于不同层的情况发生。造成同一类文件位于不同层的情况发生。也不要出现同一层实现了不同的功能的情况发生。也不要出现同一层实现了不同的功能的情况发生。