明确了聚合对象之后,我们要介绍的下一个DDD的核心概念是领域服务。领域服务概念引入的原因是现实中很多业务操作需要多个聚合相互协作才能完成,而领域服务为我们提供了实现这种协作的入口。
关于领域服务的概念,我们同样可以通过一个简单的案例来解释。让我们考虑这样一个场景:在进行银行资金转账时,用户在支付宝或微信上输入银行账户和转账金额等转账基本信息,银行执行转账操作并发送手机短信。
在这个场景中,建模的关键在于领域层需要执行资金转账操作,而这个操作势必涉及用户银行账户Account、转账金额Money、转账所生成的订单Order等领域模型对象。通过这些对象之间的交互,系统完成相应的借入和贷出操作,并提供结果的确认信息。显然,这里的Account、Order等领域模型对象都应该被抽象成聚合对象,如图2-18所示。
图2-18 多个聚合对象之间的交互过程
可以看到,这里涉及多个聚合对象协作的资金转账领域服务TransferService就是一种典型的领域服务。我们可以明确领域服务实际上就是跨聚合的交互过程,领域服务的输入对象即是各个聚合的根实体对象,而其输出往往是一个无状态的值对象。在领域服务中,由于涉及多个领域模型对象,领域对象之间的转换也是常见的实现需求。