转载地址:http://www.cnblogs.com/whitewolf/archive/2012/05/29/2524881.html

业务逻辑层是专门处理软件业务需求的一层,处于数据库之上,服务层之下,完成一些列对Domain Object的CRUD,作为一组微服务提供给服务层来组织在暴露给表现层,如库存检查,用法合法性检查,订单创建。

业务逻辑层包含领域对象模型,领域实体,业务规则,验证规则,业务流程。1:领域对象模型为系统结构描述,包含实体功能描述,实体之间的关系。领域模型处于天生的复杂性:2:领域实体:业务层是一些操作业务对象(BO)的处理。业务对象包含数据和行为,是一个完整的业务对象。其不同于上节架构设计中服务层的简单理解提到的数据迁移对象(dto),对于dto存在数据的,不存在行为,dto是bo(ddd中又称do)的子集,负责与特定界面需求的扁平化实体,dto仅仅是一个数据载体,需要跨越应用程序边界,而业务对象则不会存在复制迁移,往往一个业务对象存在一个或者多个数据迁移对象。3:业务最大的逻辑就在处理一些列现实世界的规则,这也是软件中最容易变化的部分,这里通常会出现我们众多的if-else或者switch-case的地方。也这因为如果说以个人觉得在我们的项目最应该关系和分离需求的层次。4:验证规则:业务规则很大程度上也是对对象的数据验证,验证业务对象的当前数据状态。我觉得在每个业务对象上都应该存在一个对外部对象暴露的验证接口,可以考虑微软企业库的VAB 基于Attribute声明式验证或者上节流畅的验证组件:FluentValidation中的FluentValidation验证组件基于IOC的解耦。

业务层模式:在常见的业务层模式中主要分为过程是模式和面向对象模式。过程模式有是事务性脚本和表模式,而面向对象模式为活动记录模式和领域驱动模式。理论上说事务性脚本模式是最简单的开发模式,其前期投入下,但随着项目周期和复杂度上升明显,而领域模型(DDD)前期投入较大,但是理论上说是随着项目周期和复杂度呈线性增加,当然这些都是理论值。

1:事务脚本模式是业务逻辑层最简单的模式,面向过程模式。该模式以用于的操作为起点,设计业务组件,即业务逻辑直接映射到用户界面的操作。这通常是从表现层逻辑出发,表现层我需要什么业务层提供什么,直到数据层。针对没一个用户的新功能都需要新增一个从UI到关系数据库的分支流程。其使用与逻辑不是很复杂或者变化不大稳定的应用系统开发。其不需要付出与业务无关的额外代价,并且在现代VS之类的IDE帮助下能够很快的进行快速应用开发(RAD)。也由于这种优势,也是其最大的劣势,程序中充满了IF-else,switch-case之类的逻辑或者大量的static的方法,每个功能都是一个程序分支,这对代码无法重用。编码不易于维护,对复杂项目和变化需求不适应。

2:表模式:为每个数据库表定义一个表模块类,包含操作该数据的所有行为方法。作为一个容器,将数据和行为组织在一起。其对数据的粒度针对于数据表,而非数据行,因此需要以集合或者表传递数据信息。表模式基于对象但是完全又数据库驱动开发,在业务模型和数据库关系模型显著差异的情况下,应对需求,并不是那么适合。但是在.net中提供的一些列如强类型DataSet等IDE的辅助下自动生成大量的代码,也是一个不错的选择,因为部分数据库的操作趋于自动化。表模式没太过于关注业务,而是关注数据库表结构。而业务逻辑和领域问题才是软件核心。

3:活动记录模式:一个以数据库表一行Row为对象,并且对象中包含行为和数据的模式方法。其数据对象很大程度的接近数据库表结构。在活动记录模式对象中通常也包含操作对象的CRUD行为,数据验证等业务规则。对于业务不是很复杂,对象关系与关系模型映射不具有很大差异情况,活动记录模式会运用的很好。活动模式比较简单化设计,在上现行的很多如Linq to sql,ActiveRecord框架的辅助下,将针对问题领域不是太过复杂的项目十分有用。但是其模式和数据库表结构的相互依赖,导致若你修改数据库结构,你不得不同时修改对象以及相关逻辑。如果不能保证数据库关系模型和对象模式的很大程度的相似这就进入的困境。

4:领域模型:在前面的几种模式都是项目开始站在了以数据为中心的角度,而不是业务本身的问题领域。而领域模型关注系统问题领域,首先开始为领域对象设计。与活动记录模式来说,领域模型完全站在了问题领域业务概念模型一边,与数据库,持久化完成独立,其推崇持久化透明(POCO)。其可以充分利用面向对象设计,不受持久化机制的任何约束。其实完全又业务驱动出来的。但是其最大的优势如上各个模式一样也是其最大的劣势对象模型和关系模型具有天然的阻抗,我们的领域实体早晚需要映射到持久化机制。还好的是当前有NHibearnate,EF,Fluent NHibearnate这类ORM框架辅助。在DDD中包含UOW,仓储,值类型和聚合根,领域事件,领域跟踪一类的概念,这将在以后具体说明。

模式的选择在与架构师的决定,这也是架构师具有挑战意义的职责,需要根据具体的项目需求,团队,个人等外界因素最终决定,不存在万能的模式,也不存在完美的设计。

作者:破  狼 
出处:http://www.cnblogs.com/whitewolf/ 
本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。该文章也同时发布在我的独立博客中-博客园--破狼和51CTO--破狼。

什么是业务逻辑层(业务层)及业务逻辑层(业务层)的功能相关推荐

  1. UI层自动化测试框架(五):业务层和用例层

    业务层 该层主要是App的各种业务操作,比如登录,遍历tab,下单等,也就是说把app中各项业务的操作都封装在业务层.比如说登录操作,我们把它封装一个类,登录的大致的流程是:首先是不是要找到登录入口( ...

  2. 大数据-案例-离线数仓-在线教育:MySQL(业务数据)-ETL(Sqoop)->Hive数仓【ODS层-数据清洗->DW层(DWD-统计分析->DWS)】-导出(Sqoop)->MySQL->可视化

    一.商业BI系统概述 商业智能系统,通常简称为商业智能系统,是商业智能软件的简称,是为提高企业经营绩效而采用的一系列方法.技术和软件的总和.通常被理解为将企业中的现有数据转换为知识并帮助企业做出明智的 ...

  3. [4G5G专题-56]:L2 MAC层-逻辑信道到物理信道的映射、MAC层包或PDU格式、MAC层复用与解复用

    目录 第1章  L2 MAC层的架构 1.1 RAN的架构 1.2 L2 MAC层的架构 1.3 MAC层的帧调度功能 第2章 逻辑信道到物理信道的映射 2.1 映射示意图 2.2 逻辑信道 2.3 ...

  4. 企业应用业务需求变化的分析与应对-常见的业务需求变化

    业务逻辑变化 业务逻辑包括判断逻辑.算术逻辑和顺序逻辑,而算术表达式和判断表达式分别是算术逻辑和判断逻辑的重要表达方式,因此判断逻辑和算术逻辑的变化必然体现在两种表达式的变化上.业务逻辑的变化包括:算 ...

  5. android 数据业务,【Android架构Telephony篇】之数据业务(一)

    Android: 4.4.4 Desktop: Ubuntu 15.04 这里只做一些准备事情. 不得不说,Android里的Telephony模块还是挺复杂的,要想搞个八九分清楚需要花点功夫.今天把 ...

  6. 【电信增值业务学习笔记】9基于智能网的增值业务实现技术和应用

    1.产生背景: 智能网思想发源于二十世纪八十年代中期的美国. 科学技术发展创造的高技术通信网络环境:交换和传输系统,No.7信令系统,数据库系统的飞跃发展支持了业务的处理与交换机分离的思想. 从电话网 ...

  7. embedding层和全连接层的区别是什么 一般说embedding层,实现方式就是一个没有bias的fc层

    embedding层和全连接层的区别是什么 一般说embedding层,实现方式就是一个没有bias的fc层

  8. 【Android 事件分发】事件分发源码分析 ( 驱动层通过中断传递事件 | WindowManagerService 向 View 层传递事件 )

    Android 事件分发 系列文章目录 [Android 事件分发]事件分发源码分析 ( 驱动层通过中断传递事件 | WindowManagerService 向 View 层传递事件 ) 文章目录 ...

  9. ad09机械层说明_悉数PCB上的各种层

    PCB层的定义: 阻焊层solder mask,是指板子上要上绿油的部分;因为它是负片输出,所以实际上有solder mask的部分实际效果并不上绿油,而是镀锡,呈银白色!助焊层paste mask, ...

  10. 用Gradle打包出jar文件 前面我们说过,在Android Studio里面使用Gradle来打包应用程序,一般都是build出来一个apk文件。但是有的同学是做实现层的开发,不直接做View层

    用Gradle打包出jar文件 前面我们说过,在Android Studio里面使用Gradle来打包应用程序,一般都是build出来一个apk文件.但是有的同学是做实现层的开发,不直接做View层的 ...

最新文章

  1. filebeat获取nginx的access日志配置
  2. Elasticsearch Pipeline Aggregation管道聚合详解
  3. C#中LINQ技术的简单小例
  4. 在SAP UI5应用里使用jQuery.ajax读取数据并显示在页面上
  5. 不用跑项目,组件效果所见即所得,绝了!
  6. Docker中的libcontainer架构图
  7. Android 系统(167)----OTA升级常见问题
  8. Cortex-M系列处理器指令集区别详解
  9. Java多线程如何确定线程数
  10. keras学习笔记--交叉熵
  11. editplus java显示竖线_EditPlus对齐竖线怎么调出来?
  12. Oracle 12C Sharding部署和测试
  13. linux读取excel并导入mysql_mysql命令行的导入导出sql,txt,excel(都在linux或windows命令行操作)(转自筑梦悠然)...
  14. HDU 1348(Wall)
  15. javascript数组——新建数组、访问数组、遍历数组的方法、数组对象的方法、冒泡排序算法、json的正反序列化
  16. XML External Entities 攻击(XML外部实体注入)
  17. 【有奖测评】我的产品你来反馈,有奖
  18. 程序人生——CSAPP大作业
  19. SpringBoot + SpringSecurity 短信验证码登录功能实现
  20. Android图片加载Glide框架使用详解

热门文章

  1. 常用统计算法JAVA实现 - 方差与标准差(05)
  2. Java线程阻塞和唤醒的几种方式
  3. excel批处理:如何按给定目录批量创建系列文件夹
  4. Python 小数位保留
  5. linux如何进入su超级用户,Linux下普通用户用sudo su给自己加root权限的方法
  6. [5G][NR] BWP (Bandwidth Part)
  7. 20个手机射频常见问答
  8. selenium学习----CSS selector
  9. Bugku 想蹭网先解开密码【MISC】
  10. 教你如何更改wifi密码以及防蹭网