1.分层结构
Interfaces:接口层
该层包含与其他系统交互的所有内容,例如web服务,rmi服务。
对传入的数据进行解释、验证和转换
对传出的数据就行转换,序列化等
Application:应用层
应用层负责驱动应用程序的工作流程,匹配用例
其操作是独立于接口的,可以是同步调用,或者消息驱动
适合做跨越事物、高级别的日志记录
应用层很薄,只是用来协调领域层对象以执行实际工作
Domain:领域层
领域是软件的核心(业务逻辑的核心),主要是业务逻辑的封装
每个聚合有一个包(聚合可以理解为某一个独立业务,具体依赖建模方式)
每个聚合下面包含实体类,值对象,域事件,存储库接口,工厂
Infrastructure:基础设施层
上面上个是垂直层,基础设施同时为上面三层提供服务,促进层之间的沟通
包含独立于应用程序的所有内容:外部库,数据局引擎,数据传递后端。举例:
不依赖与具体的持久化方案与实现,不依赖于消息队列的具体选型
这里提供实现,上面其它层定义接口
简言之:对于外部的依赖在这里封装,其它层无需感知具体选型与实现
去除(mock)基础设施层的代码,应该依然可以进行单元测试,而且业务逻辑整体可以跑通
2.基本概念
entity:实体
有明确的身份(id),有状态转换周期(数据改变),一般需要持久化
value object:值对象
没有明确的身份(id),没有状态转换,不可变对象
domain event:域事件
有身份(id),没有生命周期(数据不可变),是实体和值对象的混合体
aggregates:聚合
聚合一般使用一个聚合根对象实现
聚合根通过设置实体之间的关系规则来帮助解耦大型结构
聚合根也可以具有不适合单个类的属性,方法和变量
一般一个或多个模型中需要提炼一个聚合根,这样外界只需和聚合根打交道
Repositories:存储库(可以理解为一个dao层接口)
存储库工作在聚合跟之上,每个聚合根对应一个存储库
存储库用于保存聚合根对象(一般是实体类)
存储库接口属于领域层,实现属于基础设施层
Domain Services:领域服务
领域服务以域类型的形式表示
领域服务的方法参数和返回值是领域模型对象
领域服务的接口定义属于领域层,实现属于基础设施层或者领域层(根据相关度而言)
Application Services:应用服务
对领域层的工作流控制,简言之,就是根据业务拼装参数,组合调用多个底层服务。
3.包结构
Interfaces
Facade
DTO
Assembler
Application
Service
Domain
module
service
shared
Infrastructure
4.图解
备注
官方示例代码:
https://github.com/citerus/dddsample-core
官方概念解读: