除了get和set方法,注入仓储对象,编写方法使用仓储对象进行持久化操作
持久层编写接口操作数据数据库
编写仓储接口
实现仓储接口,调用持久层对象(注入持久层对象)
领域层业务类调用仓储接口中的方法
工厂要做的事(PO转DO,DO转PO)
仓储作为领域模型和数据模型的中介,它负责映射领域模型到持久化存储。
仓储实现了透明持久化,即领域层不需要关注领域对象如何持久化。
仓储是一个契约,而不是数据访问层。它明确表明聚合所必需的数据操作。
ORM框架不是仓储。仓储是一种架构模式。ORM用来以面向对象的方式来表示数据模型。仓储使用ORM来协调领域模型和数据模型。
仓储适用于具有丰富领域模型的限界上下文。对于没有复杂业务逻辑的简单限界上下文,直接使用持久化框架即可。
使用UOW进行事务管理。UOW负责跟踪对象的状态,仓储在UOW协调的事务中进行实际的持久化工作。
仓储用于管理单个聚合,它不应该控制事务。
子域与子域之间,甚至系统与系统之间使用反腐层
上游与防腐层通信使用上游的数据模型,数据模型在反腐层转换后,下游调用符合下游数据模型的方法
应用层通过应用服务接口来暴露系统的全部功能。在应用服务的实现中,它负责编排和转发,它将要实现的功能委托给一个或多个领域对象来实现,
它本身只负责处理业务用例的执行顺序以及结果的拼装
领域层就是较“胖”的一层,因为它实现了全部业务逻辑并且通过各种校验手段保证业务正确性。业务逻辑则是:业务流程、业务策略、业务规则、完整性约束等
领域层案例参考springboot-ddd-demo
在电商系统中有一些核心的功能,例如营销,购物作为核心子域,在营销时就需要用户的信息,那么用户就可以作为通用子域,核心子域和通用子域都会用到的权限认证则可以作为支撑子域
领域包含所有子域,就是我们要做的整个事情
当一个子域不能再拆分了,那么他就是一个限界上下文,当一个子域还可以拆分的更小时,那么这个子域就对应多个限界上下文
采用事件风暴的方式,根据业务行为梳理出实体和值对象
找出聚合根:是否具有独立的生命周期,是否有全局唯一id,是否可以创建或修改其他对象,是否有专门的模块来管理这个实体
找出聚合根关联的实体和值对象构建出一个聚合
多个聚合根据业务语义划分到一个限界上下文
事件风暴会议:提前邀请Project的所有相关人(包括开发,测试,产品,业务分析,UI/UX等),一起讨论
事件Event:已经发生的事实,如用户已注册,用户已登录,用户已发送等
决策命令Command:产生这个事实的的动作,如注册用户、登录用户、发送信息
发起命令的参与者User/Actor:如用户1在注册账号,用户2在登陆账号
读模型Read
Model:某个Actor做出决策命令Command的前提是需要看到某些信息,如发送信息时需要看到对方的信息
聚合Aggregate:某个Actor在某个聚合调用某种Command产生了某个Event,也就是整个流程结束
外部系统External
System和规则Policy:Event不一定由前面所说的某个Actor触发Command而产生,也可能是由外部系统或者某种规则自动触发Command而产生
application层中编写event,通常使用rabbit进行事件订阅和事件发布
事件风暴会议分析需求
根据业务行为找出实体和值对象
找出聚合根及相关的实体、值对象构建一个聚合,即一个限界上下文