领域驱动设计:领域服务与防腐层解析
1. 领域服务概述
在开发系统时,我们围绕领域进行建模。通常会先召集利益相关者开展事件风暴会议,以此更好地理解领域。在这个过程中,会明确系统子领域的各种规则和操作。
然而,在子领域中,有些操作并不属于特定的实体或聚合。比如账户之间的转账操作,它并非账户的增删改查(CRUD)操作,而是会影响多个实体,尤其是当转账涉及不同类型的账户(如贷款账户和支票账户)且处于不同的限界上下文时。以往的设计方法常试图将许多操作强行纳入基于实体的模型,这往往会带来不良后果。例如,把账户转账操作硬塞进某个账户实体,就违背了单一职责原则。
还有一种情况,领域中的某些概念可能没有合适的实体与之对应。以在线订购场景为例,托运商位于系统外部,我们需要通过UPS或联邦快递等提供的外部API来创建运输标签或查询运输状态,但与该系统的唯一关联只是一个追踪号码。若将这种接口功能强行融入系统的其他实体,显然是不合理的。
因此,对于那些不属于特定实体且需要在同一限界上下文内与多个实体交互的操作,应将其建模为独立接口,即领域服务。
领域服务具有以下重要特点:
- 操作概念非实体或值对象的一部分 :例如资金转账、订单价格计算等概念,并非属于某个特定的实体或值对象。
- 接口基于领域模型元素定义 :使用领域模型的通用语言来定义服务接口,确保各方对服务的理解一致。
- 操作无状态 :领域服务不保存状态,专注于执行领域操作和业务规则。
2. 领域服务示例
以Joe’s Pi
超级会员免费看
订阅专栏 解锁全文
36

被折叠的 条评论
为什么被折叠?



