当前位置: 代码迷 >> .NET分析设计 >> 让人纠结的三层架构,该怎么处理
  详细解决方案

让人纠结的三层架构,该怎么处理

热度:363   发布时间:2016-05-01 22:36:11.0
让人纠结的三层架构
有人告诉我,DAL里不能出现任何业务逻辑,并且具有可重用性。
有人告诉我,BLL里不能出现任何SQL语句和事务。

俺疑问的是,多表关联查询呢该放在哪儿呢?别告诉我用视图。
------解决方案--------------------
DAL 负责 多表关联查询的SQL生成和执行
BLL 负责 将业务条件转换为DAL的数据条件,BLL还要检查用户权限、添加用户数据限制等。。
------解决方案--------------------
不用视图的话,BLL负责组织多个DAL之间的联系。
BLL只是负责调用DAL,并不会出现SQL语句。
事务的开启和结束在BLL里面定义出现实际。
------解决方案--------------------
DAL并不是与表和视图一一对应的。
可以定义一个DAL,DAL.Query里面的SQL写多表查询,这个DAL就不对应数据库中的表或者视图,而是一个SQL语句。
------解决方案--------------------
多表关联 是一种数据关系
比如表A和表B的外键关系

而业务逻辑关心的的是业务对象之间的关系

比如 用户需要查询 某小区的房屋
那么业务逻辑 进一步明确为  此用户可看的 已审核的 房屋信息 且是某小区的

而数据逻辑 进一步明确为 查询 房屋信息表 条件包括:对应房屋审核表中状态为已审核,对应小区表中 小区编号为AAA,对应 房屋访问权限表中访问人为 此用户
------解决方案--------------------
呵呵,别拘泥。

业务逻辑可以出现任何一层,判定标准是开-闭,如果就他自己用,为啥不可以封闭呢?
比如订单流水号的生成,需求要求生成有规则的且唯一的编号,这该算具体业务吧!那他为啥不能在dal里实现??

别太拘泥就成,OO关注抽象,关注变化和变化的速度。 实际上很多细节处理放在任意一层都可以,这个并不是OO的关注的核心。
------解决方案--------------------
三层的意思就是在表现层不出现任何数据库概念,而只与中间业务逻辑层绑定对应关系,这就是三层。
------解决方案--------------------
wanghui0380:
呵呵,不是拘泥的问题,对新手来说,划清这个界限很重要,要不然永远体会不到3层的必要性
就比如你举的例子:
//需求要求生成有规则的且唯一的编号,这该算具体业务吧!那他为啥不能在dal里实现??

这个里面需求是:生成有规则的且唯一的编号
业务规则可能是:单据类别(2位)+日期(8位)+流水号(4位数字)
                TA201012100001
而数据处理时,可能会把这个字段拆成3个字段存储(应根据数据存储、查询、性能等要求)
而流水号的分配也有很多中分配方式,数据库自动增长、存储过程分配、。。。

所以将BLL和DAL严格区分很有必要,将来换了流水号的分配方式就不用变动BLL层
------解决方案--------------------

这个问题我也一直很疑惑

sql如果有关联查询的对与以后扩展是很麻烦的


如果不是的话
这样似乎是没效率的
一一对应的表和实体

这样似乎有很有些不对

实体的属性是另外一个实体怎么办??

------解决方案--------------------
引用:
引用:
你的意思是说为了获取一个DTO可能会通过获取多个Entity来获得 获得多个Entity 每个Entity查询一次?

这是我的理解,不一定对哦。


但是这样导致的就是性能大打折扣

我一直很纠结这个问题







-------------

楼主不要结贴

已经各推荐了 
等人高手来看看怎么办

呵呵
------解决方案--------------------
引用:
还有一点,为加快前期开发速度,以及适应项目不断调整的需要,俺的DAL使用了泛型和反射实现了一个数据访问工厂,但对于多表关联查询支持很弱,希望大家能提出好的解决方案。

我的做法跟 lz 差不多,自己写了 DataModelManager 来完成 ORMapping 的工作,
其实就是 lz 说的“DAL使用了泛型和反射实现了一个数据访问工厂”,其实跟 LINQ 做的事儿差不多。

至于多表联合查询,其实质是对象的多个简单类型属性及对象类型属性进行复杂查询,
而多表联合查询是利用关系数据库的特性,将对象的复杂查询的扁平化,以提高查询速度!

我设计了一个 QueryConditionString 类,用于动态拼接 Where 语句,
多表查询时,必须写入表名,以标明所属的表,而 select 是事先在 DAL 中写好的,
查询结果会被封装为 List<BusinessModel> 返回。

至于纯对象的复杂查询我也尝试过,确实比较麻烦,而且数据量较大时,性能方面确实存在一些问题,
还没来得及研究优化方案。
  相关解决方案