各层的作用
数据数据访问层:主要是对原始数据(数据库或者文本文件等存放数据的形式)的操作层而不是指原始数据也就是说是对数据的操作而不是数据库具体为业务逻辑层或表示层提供数据服务.
业务逻辑层:主要是针对具体的问题的操作也可以理解成对数据层的操作对数据业务逻辑处理如果说数据层是积木那逻辑层就是对这些积木的搭建
表示层:主要表示WEB方式也可以表示成WINFORM方式WEB方式也可以表现成:aspx 如果逻辑层相当强大和完善无论表现层如何定义和更改逻辑层都能完善地提供服务
具体的区分方法
数据数据访问层:主要看你的数据层里面有没有包含逻辑处理实际上他的各个函数主要完成各个对数据文件的操作而不必管其他操作
业务逻辑层:主要负责对数据层的操作也就是说把一些数据层的操作进行组合
表示层:主要对用户的请求接受以及数据的返回为客户端提供应用程序的访问
三层结构解释
所谓三层体系结构是在客户端与数据库之间加入了一个中间层也叫组件层这里所说的三层体系不是指物理上的三层不是简单地放置三台机器就是三层体系结构也不仅仅有B/S应用才是三层体系结构三层是指逻辑上的三层即使这三个层放置到一台机器上 三层体系的应用程序将业务规则数据访问合法性校验等工作放到了中间层进行处理通常情况下客户端不直接与数据库进行交互而是通过COM/DCOM通讯与中间层建立连接再经由中间层与数据库进行交换
开发人员可以将应用的商业逻辑放在中间层应用服务器上把应用的业务逻辑与用户界面分开在保证客户端功能的前提下为用户提供一个简洁的界面这意味着如果需要修改应用程序代码只需要对中间层应用服务器进行修改而不用修改成千上万的客户端应用程序从而使开发人员可以专注于应用系统核心业务逻辑的分析设计和开发简化了应用系统的开发更新和升级工作
那么为什么要应用中间业务层呢?举些例子:
我们假设有一段登录代码则可以这样处理Web程序外观层负责接收前台页面的数据然后传给中间层中间层对数据进行处理比如格式化防SQL注入等等一些这样的数据再传给数据访问层然后与数据库进行操作比如与数据库的用户名和密码匹配等等一些代码
中间业务层的用途有很多例如验证用户输入数据缓存从数据库中读取的数据等等……但是中间业务层的实际目的是将数据访问层的最基础的存储逻辑组合起来形成一种业务规则例如在一个购物网站中有这样的一个规则在该网站第一次购物的用户系统为其自动注册这样的业务逻辑放在中间层最合适
在数据访问层中最好不要出现任何业务逻辑!也就是说要保证数据访问层的中的函数功能的原子性!即最小性和不可再分数据访问层只管负责存储或读取数据就可以了
完善的三层结构的要求是:修改表现层而不用修改逻辑层修改逻辑层而不用修改数据层否则你的应用是不是多层结构或者说是层结构的划分和组织上是不是有问题就很难说不同的应用有不同的理解这只是一个概念的问题.
理解ASPNET中的三层结构——为什么要分三层?
我们用三层结构主要是使项目结构更清楚分工更明确有利于后期的维护和升级它未必会提升性能因为当子程序模块未执行结束时主程序模块只能处于等待状态这说明将应用程序划分层次会带来其执行速度上的一些损失但从团队开发效率角度上来讲却可以感受到大不相同的效果
需要说明一下三层结构不是NET的专利也不是专门用在数据库上的技术它是一种更加普适的架构设计理念
个人感觉
个人感觉此种架构要在数据库设计上注意表之间的关系尽力满足主与子的关系在功能上对用户要有一定的限制不要表现在对于子表的删除操作一定要慎重以免造成主表与子表的数据在逻辑上出现的主表的外键在子表中没有相对应的值
对于表的综合查询方法是
先对主表查询调用主表所对应的DL再根据主表的记录分别对每一个子表进行查询将自表的查询结果添加的主表后形成一个大的查询集合
对于表的操作(增删改)
此时只对主表进行操作调用主表对应的DL中的操作方法
RL层是逻辑判断层主要是对页面上传入的数据进行逻辑判断RL层之上就是UI
如何建立一个三层体系结构解决方案
新建一个空白解决方案然后
添加-新建项目-其他项目-企业级模版项目-C#生成块-数据访问(数据层下简称D层)
添加-新建项目-其他项目-企业级模版项目-C#生成块-业务规则(业务层下简称C层)
添加-新建项目-其他项目-企业级模版项目-C#生成块-Web用户界面(界面层下简称U层)
右键点解决方案-项目依赖项设置U依赖于DCC依赖于D
对U添加引用DC对C添加引用D
到此为止一个三层的架子建立起来了我上面说的很具体很傻瓜知道的人觉得我废话其实我这段时间很强烈的感觉到非常多的人其实对这个简单的过程完全不了解虽然不反对建个空项目和个Asp net Web应用程序项目也可以作为层的框架而且相当多的人认为其实这些企业级模板项目其实就是个空项目这是一个误区没错企业级模板项目你从解决方案资源管理器里看它是个什么也没有的但是你可以用记事本打开项目文件看见不同了吧??有些东西在背后你是看不见的不过系统已经做好了也就是说如果你在C层里的某个类里using System Data SqlClineit或者使用一个SqlConnection对象编译时候不会出错但是会在任务列表里生成一些策略警告警告你在C层里不要放应该放在D层的东西(虽然就程序来说没错但是可读性可维护性就打了折扣)而这种功能空项目是无法给你的