知识卡片

服务层的两种实现方法:领域外观与操作脚本

结构图卡

内容

服务层的具体实现方式主要有两种,区别在于服务层接口之后的职责怎么划分。领域外观方法:服务层实现为领域模型之上的一批”瘦”外观,负责外观的类本身不含任何业务逻辑,所有业务逻辑(包括领域逻辑和应用逻辑)都放在领域模型里完成——瘦外观只负责建立客户层与应用交互的边界和操作集合,这正好体现了服务层”定义应用边界”的核心特征。操作脚本方法:服务层由一批相对复杂的类组成,这些类直接实现应用逻辑(协调响应、处理工作流),但把领域逻辑委托给底层封装好的领域对象类去做;服务层暴露给客户的每个操作都以脚本形式实现,若干脚本组成一个类,一个类围绕一个主题组织相关逻辑(通常命名为”XX服务”),这些应用程序服务类之上还应该抽出一个层超类型来承载公共职责和行为。两种方法的分野本质对应着”领域逻辑与应用逻辑该不该分开放”这个问题的两种回答:领域外观方法几乎把一切都留给领域模型自己扛,操作脚本方法则明确把应用逻辑单独拎出来放进服务层脚本里、只把领域逻辑部分委托出去。

结构图

flowchart TB
  A["服务层实现方法"]
  A --> B["领域外观方法<br/>瘦外观,不含业务逻辑"]
  B --> B1["全部业务逻辑(领域+应用)<br/>都留在领域模型里"]
  A --> C["操作脚本方法<br/>脚本组成服务类"]
  C --> C1["脚本实现应用逻辑<br/>委托领域逻辑给领域对象"]

参考来源

- 位置:《企业应用架构模式》第二部分"模式"之"第9章 领域逻辑模式"之"9.4.1 运行机制"(源文件:_epub-src/OEBPS/Text/000071.html) - 结论依据:原文说明"在领域外观方法中,服务层以领域模型之上的瘦外观集合方式实现。负责实现外观的类不包含任何业务逻辑,所有业务逻辑均由领域模型实现……在操作脚本方法中,服务层是由一组相对复杂的类组成,这些类直接实现应用逻辑,但将领域逻辑委托给封装好的领域对象类",直接支撑本卡结构图。 - 原始内容:每一个类组成一个应用程序"服务",通常服务类型的名字都为"XX服务"。服务层由这些应用程序服务类组成,在它们之上应当扩展出一个抽象了职责和公共行为的层超类型。