知识卡片

五种分层方式的比较与中介层可选原则

结构图卡

内容

本书采用的表现层/领域层/数据源层三层模型并不是唯一的分层方式,其他架构教材各有取舍。Brown模型在三层基础上插入两个中介层,共五层:表现层、控制层/中介层(表现层与领域层之间,对应本书的应用控制器)、领域层、数据映射层(领域层与数据源层之间,对应本书的数据映射器)、数据源层。J2EE Core Patterns方案分五层:客户层、表现层、业务层、集成层、资源层——它的独特之处是把”表现层”拆成了客户端部分(客户层)和服务器端部分(表现层),业务层与集成层大致对应、资源层则是集成层要连接的外部服务。Microsoft DNA架构定义表现层、业务层、数据访问层三层,结构上和本书三层能对上号,但关键区别在于数据传递方式:所有层都直接操作数据访问层通过SQL产生的记录集,这个记录集实质上充当了各层之间的数据传输对象,代价是业务层和表现层都被迫要了解数据库结构,好处是表现层可以直接用一些对数据敏感的GUI控件操作被业务层修改过的记录集(这种架构下领域层常组织成表模块、数据源层用表数据入口)。Marinescu方案用五层,把领域层拆成了领域模型加一层服务层——本质是把面向用例的工作流逻辑从纯粹的领域逻辑里剥离出来,是否值得这样拆分存在争议,作者个人认为偶尔有用、大多数情况没必要。Nilsson模型层次更复杂,因为大量依赖存储过程、鼓励把领域逻辑塞进存储过程以求性能,作者本人并不认同这种做法(会增加维护开销),但承认这是一种(用得不多的)优化技巧;Nilsson也和Marinescu一样单独设了应用层和领域层,并同样认为小型系统可以不设领域层——这一点上两人和作者的立场一致:领域模型对小型系统意义不大。作者本人的方法论是:先从三个基本层出发,只有当它们真的变得过于复杂时,才考虑引入应用控制器、数据映射器这类中介层来分担压力——中介层始终是可选的额外方案,不是起手就该有的标配。

结构图

flowchart TB
  A["本书三层:表现/领域/数据源"]
  B["Brown模型五层<br/>+控制层(应用控制器)+数据映射层"]
  C["J2EE Core Patterns五层<br/>客户/表现/业务/集成/资源"]
  D["Microsoft DNA三层<br/>记录集充当跨层DTO,但各层需懂数据库"]
  E["Marinescu五层<br/>领域层拆成领域模型+服务层"]
  F["Nilsson模型<br/>大量依赖存储过程装领域逻辑"]
  A -.->|"复杂度上升才加中介层"| B

参考来源

- 位置:《企业应用架构模式》第一部分"表述"之"第8章 通盘考虑"之"8.5 其他分层方式"(源文件:_epub-src/OEBPS/Text/000059.html) - 结论依据:原文说明"该模型包含五个层次:表现层、控制层/中介层、领域层、数据映射层和数据源层……那么,对于我来说,并不总是有用的中介层只是设计中一个可选的额外方案罢了。我的方法总是先考虑三个基本层,看看它们是否变得过于复杂。如果它们变得过于复杂,则增加这些中介层来分担一些任务",并逐一介绍J2EE Core Patterns/Microsoft DNA/Marinescu/Nilsson四种分层方案的差异,直接支撑本卡结构图。 - 原始内容:我的方法总是先考虑三个基本层,看看它们是否变得过于复杂。如果它们变得过于复杂,则增加这些中介层来分担一些任务。