知识卡片
服务层的作用:统一API入口与横切关注点落点
内容
服务层是把领域层再切出的一层,架在底层的领域模型或表模块之上——只有当领域层用领域模型或表模块、逻辑本身已经比较复杂时才有必要这么切分;如果领域层只是简单的事务脚本,本身就没有复杂到需要再单独切一层。切出服务层后,表现层与领域层的所有交互都通过服务层完成,服务层就像是这个应用程序对外暴露的API。这样做带来两个好处:一是让上层调用方看到一个清晰、统一的方法集合,不用直接摸到领域模型内部纷繁的对象网络;二是服务层天然是放置事务控制、安全校验这类横切关注点的好位置——因为所有对外调用都要经过这一层,可以在这里统一描述每个方法的事务边界和安全特征(有时借助独立的特性文件,.NET环境下也可以直接用属性标注在代码里描述)。可迁移启发:判断一个系统是否值得引入服务层,先看领域层内部的组织是否已经复杂到调用方直接摸内部会很痛苦,而不是不假思索地默认加一层——[[三种领域逻辑组织模式概览对比]]中提到,仅用事务脚本时领域层本身并不复杂,此时额外切服务层是浪费的抽象。
参考来源
- 位置:《企业应用架构模式》第一部分"表述"之"第2章 组织领域逻辑"之"2.2 服务层"(源文件:_epub-src/OEBPS/Text/000016.html)
- 结论依据:原文说明"服务层独立出来,置于底层的领域模型或表模块之上。通常只有使用领域模型或表模块时才会这样细分……表现逻辑与领域层的交互完全通过服务层,就好像应用程序的API一样。在提供一个清晰的API的同时,服务层也是放置事务控制和安全等功能的好场所",直接支撑本卡结论。
- 原始内容:处理领域逻辑的常见方法是将领域层再细分成两层。服务层独立出来,置于底层的领域模型或表模块之上……在提供一个清晰的API的同时,服务层也是放置事务控制和安全等功能的好场所。