知识卡片
三个基本层次的职责划分与依赖方向铁律
内容
全书围绕表现层、领域层、数据源层三个基本层次展开(命名取自文献[Brown et al.])。表现层负责用户或外部系统(人类、命令行脚本、Web Service调用方)与软件的交互,把外部输入解释成对领域层或数据源层的动作,并把结果显示回去。领域层承担应用必须完成的核心业务工作:依据输入或已有数据做计算、对表现层传入的数据做验证、决定该调度哪些数据源逻辑,是三层中真正装业务规则的地方。数据源层负责与数据库、事务监控器、消息系统等外部系统的交互,对多数企业应用而言主要职责是持久化数据存取。三层之间有一条不能违反的依赖方向铁律:领域层和数据源层绝对不能反过来依赖表现层——这两层的代码里不允许出现调用表现层代码的情况,这样替换表现层(例如给已有Web应用新增命令行界面)时,下面两层不需要跟着连锁修改。领域层与数据源层之间的耦合程度则取决于数据源层采用的具体架构模式。实践中表现层常常绕过领域层直接读取数据源层数据,这样做并不”纯粹”但往往可行。三层划分不要求对应不同的类或物理进程:简单系统可以只是同一过程里的三个子程序,复杂度上升后才逐步演化为不同的类、再到不同的包。
结构图:
flowchart TB
P["表现层<br/>解释外部输入/展示结果"]
D["领域层<br/>业务规则/计算/验证/调度"]
S["数据源层<br/>持久化存取/外部系统交互"]
P -->|"调用"| D
P -.->|"实践中常绕过,不纯粹但可行"| S
D -->|"调用"| S
D -.->|"禁止依赖"| P
S -.->|"禁止依赖"| P
参考来源
- 位置:《企业应用架构模式》第一部分"表述"之"第1章 分层"之"1.2 三个基本层次"(源文件:_epub-src/OEBPS/Text/000013.html)
- 结论依据:原文逐一定义"表现逻辑处理用户与软件间的交互……数据源逻辑主要关注与其他系统的交互……最后一部分就是领域逻辑……包括根据输入数据或已有数据进行计算,对从表现层输入的数据进行验证,以及根据从表现层接收的命令来确定应该调度哪些数据源逻辑",并明确"领域层和数据源层绝对不要依赖于表现层。也就是说,在领域层和数据源层的代码中,不要出现调用表现层代码的情况",直接支撑本卡结构图。
- 原始内容:伴随着分离,还有一条关于依赖性的普遍原则:领域层和数据源层绝对不要依赖于表现层。也就是说,在领域层和数据源层的代码中,不要出现调用表现层代码的情况。这条规则将简化在相同的基础上替换表现层的代价,也使得表现层的修改所带来的连锁反应尽可能小。