DDD领域驱动设计落地
例如:Entity对象、持久层资源操作Dao、资源整合(db、redis)Repository(ps:资源实现,领域层需要什么,实现什么)例如:视图对象VO、业务实现service、资源Repository接口(ps:由基础层实现,要什么放什么方法)例如:业务service接口、Mq事件订阅发布。例如:数据传输对象DTO、Api调用门面接口Controller。基础层{infrastructrue
话不多说先上图
-
应用层{application}
- 应用服务位于应用层。用来表述应用和用户行为,负责服务的组合、编排和转发,负责处理业务用例的执行顺序以及结果的拼装。
- 应用层的服务包括应用服务和领域事件相关服务。
- 应用服务可对微服务内的领域服务以及微服务外的应用服务进行组合和编排,或者对基础层如文件、缓存等数据直接操作形成应用服务,对外提供粗粒度的服务。
- 领域事件服务包括两类:领域事件的发布和订阅。通过事件总线和消息队列实现异步数据传输,实现微服务之间的解耦。
- 例如:领域服务编排process、Spring事件、Mq消息订阅发布。(应用层是很薄的一层可以只做服务编排)
-
领域层{domain}
- 领域服务位于领域层,为完成领域中跨实体或值对象的操作转换而封装的服务,领域服务以与实体和值对象相同的方式参与实施过程。
- 领域服务对同一个实体的一个或多个方法进行组合和封装,或对多个不同实体的操作进行组合或编排,对外暴露成领域服务。领域服务封装了核心的业务逻辑。实体自身的行为在实体类内部实现,向上封装成领域服务暴露。
- 为隐藏领域层的业务逻辑实现,所有领域方法和服务等均须通过领域服务对外暴露。
- 为实现微服务内聚合之间的解耦,原则上禁止跨聚合的领域服务调用和跨聚合的数据相互关联。
- 例如:视图对象VO、业务service、资源Repository接口(ps:由基础层实现,要什么放什么方法)
-
基础层{infrastructure}
- 基础服务位于基础层。为各层提供资源服务(如数据库、缓存等),实现各层的解耦,降低外部资源变化对业务逻辑的影响。
- 基础服务主要为仓储服务,通过依赖反转的方式为各层提供基础资源服务,领域服务和应用服务调用仓储服务接口,利用仓储实现持久化数据对象或直接访问基础资源。
- 例如:Entity对象、持久层资源操作Dao、资源整合(db、redis)、Repository(ps:资源实现,领域层需要什么,实现什么)
-
接口层{interfaces}
- 接口服务位于用户接口层,用于处理用户发送的Restful请求和解析用户输入的配置文件等,并将信息传递给应用层。
- 例如:数据传输对象DTO、Api调用门面接口Controller。
DDD常用手段:
一、抽象数据存储层
1、使用充血模型的实体对象,描述核心业务能力。
2、使用仓库和工厂,封装实体持久化操作(摆脱数据库限制,例如:hibernate -> mybatis,如果所有sql操作都封装在infrastructure包里,作为repository类去被调用,那么infrastructure就是天然防腐层,即使项目切换了orm框架,改造的也只是infrastructure包内的sql操作语法结构,而不需要改动其他的任何业务代码,工程量变得很低。)
二、抽象第三方服务
1、构建防腐层,隔离外部服务(外调rpc接口提供适配器,即使外调接口如何变化,通过适配器转换成统一的返回对象,保证领域服务不会腐败)
三、抽象中间件
1、构建防腐层,隔离第三方组件 (同上,可以归为一点)
四、用领域服务封装多实体逻辑
1、使用领域服务,封装跨实体业务(简单来说就是单个领域内的所有业务编排在领域层里,将不同实体(充血)、聚合根对象(BO)进行组装编排,而应用层则协调编排不同的领域对象,组织形成业务场景,即领域层处理单个业务领域内的复杂逻辑,而应用层编排多个领域类(包括领域服务、实体、repository仓库)以及跨领域的技术组件)
更多推荐
所有评论(0)