- 浏览: 52727 次
- 性别:
- 来自: 南京
文章分类
最新评论
-
kenche1:
峰哥,翻了几篇文章,终于确定你是BigHan出来的了,方便交流 ...
webservice客户端调用复杂对象报错,求帮助啊!!! -
yaoyun229:
写的很好,看你的文章之前,我也一直以为 mvc == 三层架构 ...
三层架构,MVC浅谈【一】 -
dicmo:
解决了吗??是不是JDK版本问题
webservice客户端调用复杂对象报错,求帮助啊!!! -
cd1989929:
请问这个问题解决了吗?我也遇到了
webservice客户端调用复杂对象报错,求帮助啊!!! -
高成锋:
我发布这个问题的时候是希望能人帮我解决,哎,等到最后还是 ...
tomcat服务启动中但是不能访问服务下的项目,怎么办?
转自: http://hi.baidu.com/myaspdotnet/blog/item/1ba70938a71b79f7b311c73e.html
引言:本文不是从理论的角度来探讨三层架构,而是用一个示例来介绍如何建设一个三层架构的项目,并说明项目中各个文件所处的层次与作用。写本文的目的,不是为了说明自己的这个方法有多对,别人的肯定不对,而是希望给那些初学三层架构却不知从何入手的朋友提供一点帮助。因为网上的文章,大多是注重理论的介绍,而忽略了具体的实践应用,或者有示例但讲得不透彻。导致看了之后,理论上又学习了一遍,但还是不知道代码怎么写。所以想从这个方面入手写一下,让从来没做过三层架构的初学者也能照猫画虎,写出代码来。文章表述的是笔者个人对三层架构的认识,肯定有许多不足的地方,欢迎大家指正,小弟也会根据反馈来修改这篇文章。文中的代码是伪代码,仅用来阐明思路。
正文:
一提三层架构,大家都知道是表现层(UI),业务逻辑层(BLL)和数据访问层(DAL),而且每层如何细分也都有很多的方法。但具体代码怎么写,到底那些文件算在哪一层,却是模模糊糊的。下面用一个简单的例子来带领大家实战三层架构的项目,这个例子只有一个功能,就是用户的简单管理。
首先建立一个空白解决方案,添加如下项目及文件
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
相信大家已经看出来了,这个和Petshop的示例没什么区别,而且更简单,因为在下也是通过Petshop学习三层架构的。但一些朋友对于这几个项目所处的层次,以及它们之间的关系,可能比较模糊,这里逐个说明一下:
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来做了,这种情况下User.aspx.cs才算有了真正的用途。
2、NewBLL.cs
添加如下方法:
public IList<UserInfo> GetUsers():返回所有的用户信息列表
public UserInfo GetUser(int UserId):返回指定用户的详细信息
public bool AddUser(UserInfo User):新增用户信息
public bool ChangeUser(UserInfo User):更新用户信息
public void RemoveUser(int UserId):移除用户信息
此文件就属于业务逻辑层了,专门用来处理与业务逻辑有关的操作。可能有很多人觉得这一层唯一的用途,就是把表现层传过来的数据转发给数据层。这种情况确实很多,但这只能说明项目比较简单,或者项目本身与业务的关系结合的不紧密(比如当前比较流行的MIS),所以造成业务层无事可做,只起到了一个转发的作用。但这不代表业务层可有可无,随着项目的增大,或者业务关系比较多,业务层就会体现出它的作用来了。
此处最可能造成错误的,就是把数据操作代码划在了业务逻辑层,而把数据库作为了数据访问层。
举例:有些朋友感觉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中也就有了逻辑处理的代码。
3、UserModel.cs
实体类,这个东西,大家可能觉得不好分层。包括我以前在内,是这样理解的:UIßàModelßàBLLßàModelßàDAL,如此则认为Model在各层之间起到了一个数据传输的桥梁作用。不过在这里,我们不是把事情想简单,而是想复杂了。
Model是什么?它什么也不是!它在三层架构中是可有可无的。它其实就是面向对象编程中最基本的东西:类。一个桌子是一个类,一条新闻也是一个类,int、string、doublie等也是类,它仅仅是一个类而已。
这样,Model在三层架构中的位置,和int,string等变量的地位就一样了,没有其它的目的,仅用于数据的存储而已,只不过它存储的是复杂的数据。所以如果你的项目中对象都非常简单,那么不用Model而直接传递多个参数也能做成三层架构。
那为什么还要有Model呢,它的好处是什么呢。下面是思考一个问题时想到的,插在这里:
Model在各层参数传递时到底能起到做大的作用?
在各层间传递参数时,可以这样:
AddUser(userId,userName,userPassword,…,)
也可以这样:
AddUser(userInfo)
这两种方法那个好呢。一目了然,肯定是第二种要好很多。
什么时候用普通变量类型(int,string,guid,double)在各层之间传递参数,什么使用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这三个参数的四种组合模式。UserId其实也可以合并到user中,但项目中其它BLL都实现了带有id参数的接口,所以这里也保留这一项。
传入了userInfo,那如何处理呢,这个就需要按照先后的顺序了,有具体代码决定。
这里按这个顺序处理
首先看是否同时具有username和password,然后看是否同时具有email和password,然后看是否有username,然后看是否有email。依次处理。
这样,如果以后增加一个新内容,会员卡(number),则无需更改接口,只要在DAL的代码中增加对number的支持就行,然后前台增加会员卡一项内容的表现与处理即可。
4、UserDAL.cs
public IList<UserInfo> 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,一个可以随意弃置的部分,又怎么能成为三层架构中的一层呢。
可以这样定义:与数据源操作有关的代码,就应该放在数据访问层中,属于数据访问层
5、IUserDAL
数据访问层接口,这又是一个可有可无的东西,因为Petshop中带了它和ClassFactory类工厂,所以有些项目不论需不需要支持多数据源,都把这两个东西做了进来,有的甚至不建ClassFactory而只建了IDAL,然后“IUserDAL iUserDal = new UserDAL();”,不知意义何在。这就完全是画虎不成反类犬了。
许多人在这里有一个误解,那就是以为存在这样的关系:BLLßàIDALßàDAL,认为IDAL起到了BLL和DAL之间的桥梁作用,BLL是通过IDAL来调用DAL的。但实际是即使你如此编码:“IUserDAL iUserDal = ClassFacotry.CreateUserDAL();”,那么在执行“iUserDal.SelectUsers()”时,其实还是执行的UserDAL实例,而不是IUserDAL实例,所以IDAL在三层中的位置是与DAL平级的关系。
通过上面的介绍,基本上将三层架构的层次结构说明了。其实,本人有一个判断三层架构是否标准的方法,那就是将三层中的任意一层完全替换,都不会对其它两层造成影响,这样的构造基本就符合三层标准了(虽然实现起来比较难^_^)。例如如果将项目从B/S改为C/S(或相反),那么除了UI以外,BLL与DAL都不用改动;或者将SQLServer改为Oracle,只需替换SQLServerDAL到OracleDAL,无需其它操作等等。本来想在文中加入一些具体的代码的,但感觉不是很必要,如果大家觉得需要的话,我再补充吧。
总结:不要因为某个层对你来说没用,或者实现起来特别简单,就认为它没有必要,或者摒弃它,或者挪作它用。只要进行了分层,不管是几层,每一层
发表评论
-
三层架构,MVC浅谈【三】
2011-01-10 16:55 14421. SSH三层架构 为了实现web层(struts)和 ... -
三层架构,MVC浅谈【二】
2011-01-10 16:54 13521. 如果理解业务逻辑呢 ... -
三层架构,MVC浅谈【一】
2011-01-10 16:52 3597首先感谢那些无私奉献自己知识的师长们。 其实一直以来我对所谓 ... -
spring学习总结【二】
2011-01-07 16:15 9221.1. 依赖注入 当我们把依赖对象交给外部容器去创建时 ... -
spring学习总结【一】
2011-01-07 16:14 10551. Spring简介 Spring使用简单的javabea ... -
struts2学习笔记【十二】 / 标签
2011-01-07 16:09 9191. Struts2标签库 1.1. Struts2标签库概 ... -
struts2学习笔记【十一】 / Interceptor(2)
2011-01-07 16:07 9091.5. 权限认证 一般情况下,在WEB-INF下的内容不登 ... -
struts2学习笔记【十一】 / Interceptor(1)
2011-01-07 16:05 8951. Interceptor拦截器 1.1. 拦截器简介 ... -
struts2学习笔记【十】/ OGNL
2011-01-07 16:03 1023Ognl【Object-Graph Navigation la ... -
struts2学习笔记【九】/ 获取request,Session的方法
2011-01-06 14:07 8771. 获取request,session的方法 1.1. 非 ... -
struts2学习笔记【八】/ struts.xml--action
2011-01-06 14:05 12171. action详解 Action自身的设置在packag ... -
struts2学习笔记【七】/ struts.xml--package
2011-01-06 14:03 1381package详解 1.1. action A)na ... -
struts2学习笔记【六】/ 配置文件之struts.xml
2011-01-04 13:50 10221. struts.xml详解 1.1. bea ... -
struts2学习笔记【五】/配置文件之struts.properties
2011-01-04 13:48 869我自己也做了一些总结,但是篇幅比较大,所以,大家不妨访问 ... -
struts2学习笔记【四】/配置文件简介
2011-01-04 13:46 8161.1. Web.xml 服务启动文件 1.2. stru ... -
struts2学习笔记【三】/处理用户输入信息
2011-01-04 13:42 8251. Struts2处理用户输入信息 1.1. 领域对象 ... -
struts2学习笔记【二】/开发设置
2011-01-04 13:41 8281. 开发设置 有的时候,struts2中没有标签提示,这个 ... -
struts2学习笔记【一】/第一次接触
2011-01-04 13:38 1052总是在用struts1.2开发,不过总是存在着一种危机感似的, ...
相关推荐
全书共10章,主要包括贯穿项目案例介绍、传统的三层框架、项目框架分析、项目表示层技术、业务逻辑层技术、数据访问层技术linq、项目框架技术微软企业类库、uml实现面向对象的分析与设计、办公自动化系统综合案例、...
【C#项目实战】学生社团信息管理系统(MVC三层架构) 基于三层架构,含实训报告,源代码,数据库文件。 【这个数据库少了公告表,请自行根据实训报告更改】 项目最新地址:https://www.lanzous.com/i4mtx8b 我也没空...
《C#学生成绩管理系统:三层架构与CS,BS版本解析》 在信息化教育的时代,学生管理系统成为教学管理中不可或缺的一部分。C#学生成绩管理系统是利用C#编程语言开发的一款高效、便捷的管理工具,它包括客户端(CS)和...
通过分析和研究这些代码,开发者可以深入了解如何在实际项目中整合C#和Halcon,以及如何运用三层架构来优化视觉系统的结构。 总结来说,这个2022年的C#+Halcon视觉项目案例,不仅展示了现代工业视觉系统开发的前沿...
在IT行业中,三层C-S(Client-Server)结构是一种经典的分布式应用架构,广泛应用于大型企业级软件开发。这种结构将应用程序分为三个主要部分:表现层(客户端)、业务逻辑层(服务器端)和数据访问层(数据库)。...
本项目采用Dnet主流的三层架构为最主要的开发框架。同时会涉及到jQuery Ajax、XML、jQuery插件 、Dtree递归树\WebChart高级图表统计图\Excel导出复杂报表打印\CodeSmith\图片水印\防盗链\WebService\面向对象的建模...
【标题】"三层体系结构的应用-学员管理系统1(后台)"所指的知识点主要涉及软件开发中的架构设计,尤其是企业级应用中的经典模式——三层架构。三层架构是一种将应用程序分为独立、松散耦合的三个部分的模型,这些部分...
通过分析和实践这个项目,学习者可以深入了解数据源连接的处理方式,以及如何运用三层架构组织复杂的软件系统。同时,这也是一个实战训练,让学习者能够在实践中掌握编程技能,提升自己在IT行业的竞争力。
三层架构是一种广泛应用的软件设计模式,它将应用程序分为表现层(UI)、业务逻辑层(BLL)和数据访问层(DAL)。这种结构有助于提高代码的可重用性、可维护性和可扩展性。 1. 表现层(UI):这是用户与系统交互的...
2. **架构模式与风格**:常见的架构模式有微服务、面向服务架构(SOA)、三层架构等。选择合适的架构风格能够满足系统的可维护性、可扩展性和可重用性。 3. **组件与接口设计**:将系统划分为独立的组件,明确组件...
这个“RemObjects三层演示代码”很显然是一个示例项目,展示了如何使用RemObjects技术来构建一个典型的三层架构应用。三层架构通常包括表现层(Presentation Layer)、业务逻辑层(Business Logic Layer)和数据访问...
《Wireshark数据包分析实战(第三版)》是一本专门讲解如何有效利用Wireshark进行数据包分析的书籍,其中包含了丰富的实例和实践指导。 本书的抓包资源文件是配合书中的案例和练习而提供的,这些文件可以在实际操作中...
【三层结构设计的好友通信录】是一套基于C#编程语言实现的通信录管理系统,它采用了经典的三层架构设计模式,这种模式在IT行业中被广泛应用于软件开发,以提高代码的可维护性和可扩展性。本系统的核心是通过将业务...
5. **源代码**:实训提供的源代码应包含上述各层的实现,开发者可以通过阅读和分析这些代码,理解如何在.NET环境下构建和组织三层架构的应用。 6. **实训指导文档(.doc)**:这份文档可能详细解释了实训的步骤、...
《Wireshark 数据包分析实战(第 3 版)》的第 9.5 小结主要聚焦于总结在应用层流量分析中常见的协议及其重要性。在本章中,作者深入探讨了多种用于网络通信的应用层协议,这些协议在日常的互联网使用中起着至关重要...
SSM(Spring、SpringMVC、MyBatis)框架是Java Web开发中常见的技术栈,尤其适合构建三层架构的企业级应用。在这个“ssm三层框架实战练习”中,你将有机会深入理解并实践这三个框架如何协同工作,打造一个完整的商城...
在现代网络架构中,CISCO三层交换技术扮演着至关重要的角色,它在数据传输和网络隔离方面提供了高效且灵活的解决方案。本专题集锦将深入探讨这一关键技术,旨在帮助读者理解和掌握其核心原理与应用。 ### 1. 三层...
【标题解析】:“[其他...总的来说,"Xluo大型三层架构短消息系统 v1.0"是一个供开发者学习和参考的源码项目,涵盖了软件设计、业务逻辑处理和数据库操作等多个方面,对提升开发者的技术水平和实战能力具有积极意义。