DDD理论学习系列(8)-- 应用服务&领域服务
2023/8/4 21:22:17
本文主要是介绍DDD理论学习系列(8)-- 应用服务&领域服务,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
1. 引言
单从字面理解,不管是领域服务还是应用服务,都是服务。而什么是服务?从SOA到微服务,它们所描述的服务都是一个宽泛的概念,我们可以理解为服务是行为的抽象。从前缀来看,根据DDD的经典分层架构,它们又隶属于不同的层,应用服务属于应用层,领域服务属于领域层。
DDD传统分层架构
应用层(Application):负责展现层与领域层之间的协调,协调业务对象来执行特定的应用程序任务。它不包含业务逻辑。
领域层(Domain):负责表达业务概念,业务状态信息以及业务规则,是业务软件的核心。
所以综合来看应用服务是用来表述应用行为,而领域服务用来表述领域行为。
那怎么理解应用行为和领域行为呢,应用行为描述了一个具体操作从开始到结束的每一个环节,而领域行为是对应用行为的细化,用来处理具体的某一个环节。比如,我们手机购物,从购物车结算这一场景来举例,这就是一个应用行为。而这个应用行为又主要包括金额计算、支付、生成订单,这些子环节就可以理解为一个领域行为。
我们就不咬文嚼字了,下面我们就一一展开。
2. 应用服务
应用服务是用来表达用例和用户故事(User Story)的主要手段。
应用层通过应用服务接口来暴露系统的全部功能。在应用服务的实现中,它负责编排和转发,它将要实现的功能委托给一个或多个领域对象来实现,它本身只负责处理业务用例的执行顺序以及结果的拼装。通过这样一种方式,它隐藏了领域层的复杂性及其内部实现机制。
应用层相对来说是较“薄”的一层,除了定义应用服务之外,在该层我们可以进行安全认证,权限校验,持久化事务控制,或者向其他系统发生基于事件的消息通知,另外还可以用于创建邮件以发送给客户等。
应用层作为展现层与领域层的桥梁。展现层使用VO(视图模型)进行界面展示,与应用层通过DTO(数据传输对象)进行数据交互,从而达到展现层与DO(领域对象)解耦的目的。
3.领域服务
领域层就是较“胖”的一层,因为它实现了全部业务逻辑并且通过各种校验手段保证业务正确性。而什么是业务逻辑呢?业务流程、业务策略、业务规则、完整性约束等。
当领域中的某个操作过程或转换过程不是实体或值对象的职责时,我们便应该将该操作放在一个单独的接口中,即领域服务。请确保该服务和通用语言时一致的;并且保证它是无状态的。
根据这句话我们有几个问题需要理清:
什么时候使用领域服务?
领域服务无状态怎么理解?
领域服务是用来协调领域对象完成某个操作,用来处理业务逻辑的,它本身是一个行为,所以是无状态的。状态由领域对象(具有状态和行为)保存。
上面也说了,领域对象是具有状态和行为的。那就是说我们也可以在实体或值对象来处理业务逻辑。那我们该如何取舍呢?
一般来说,在下面的几种情况下,我们可以使用领域服务:
执行一个显著的业务操作过程
对领域对象进行转换
以多个领域对象为输入,返回一个值对象。
4. 案例分析
我们拿经典的转账问题来分析一下:
而针对转账这一操作,它的业务用例应该是这样的:
检查账号余额是否足够
检查目标账户账号是否合法
转账
短信通知转账双方
其中1,2步是转账的合法性校验属于转账业务的一部分,所以,1,2,3均应该放到领域层通过领域服务来实现。短信通知,它并不是是转账的核心业务,因为这根据具体情况而定,比如只有客户订阅了账号变动通知我才发短信。所以将第4步归类到应用服务中去实现,就确保了领域服务的纯粹性。
而至于持久化的问题,我们可以这样想,领域逻辑应该只关心业务逻辑,才能保证领域逻辑的可重用性。将持久化放到应用层,我们就会有更多的选择性。
5.总结
当应用服务中的逻辑趋于复杂时,我们就要小心领域逻辑泄露到应用服务中去。而在使用领域服务时,我们又要避免过度使用,因为会导致贫血领域模型。毕竟有些单一的操作更适合放到领域对象(实体和值对象)中去。
所以总结以下:
服务是行为的抽象。
应用服务通过委托领域对象和领域服务来表达用例和用户故事。
领域对象(实体和值对象)负责单一操作。
领域服务用于协调多个领域对象共同完成某个业务操作。
应用服务不处理业务逻辑,领域服务处理业务逻辑。
作者:圣杰
链接:https://www.jianshu.com/p/435939737f5d
这篇关于DDD理论学习系列(8)-- 应用服务&领域服务的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-16轻巧的Kubernetes与WebAssembly的完美搭档
- 2024-11-16基于AWS的Java应用持续集成与持续部署全流程指南:从构建到部署在Amazon EKS上运行
- 2024-11-15为什么我在Kubernetes集群里需要一个API网关?
- 2024-11-15亚马逊EKS的未来发展趋势
- 2024-11-15使用Kubernetes简化分布式Spring Boot应用中的定时任务管理
- 2024-11-15教你轻松几步升级Hetzner上超划算的Kubernetes集群
- 2024-11-15动手排查Kubernetes网络故障之旅
- 2024-11-15Kubernetes监控:最佳实践指南
- 2024-11-15两年使用Kubernetes运行Airflow后我们学到的经验教训
- 2024-11-15如何用三条配置行解决我们在Kubernetes中遇到的gRPC扩展问题