模块划分
包划分
代码样例
设计原则
biz层,domain层是实现业务核心逻辑的地方。有且只有业务代码,对外部的基础设施的依赖应放到基础设施层
biz层 (一个接口对应一个业务功能)
特点:调用1个或多个领域服务或实体,流程编排,共同实现一个业务功能。还包括鉴权,事务,事件,通知,日志等任务
domain层(一个接口对应一个领域内功能)
domain service 没有外部依赖,只有纯业务逻辑。可直接写单测无需mock
只定义repository,不实现
基础设施层屏蔽底层实现细节。biz层,domain层如果有依赖基础设施层的地方,只需要定义接口即可。全部统一由本层来实现
— fangqiang 2023/12/06 09:47
值对象,实体,领域服务
值对象: 只有数据和get、set方法
实体:含有数据、和基本逻辑
领域服务:调用实体完成业务功能
哪写方法可以放入领域服务?
领域行为需要多个领域实体参与协作
领域行为与状态无关
领域行为需要与外部资源(尤其是DB)协作
函数放哪的原则
看图
左边:判断方法下沉到实体类
右边:判断方法放在服务类
应用服务
获取用户参数
转成转成领域服务的参数
调用领域服务完成业务功能
接收领域服务返回的值
调用基础服务,完成其他操作(如:调用邮件服务发送邮件)
转换成用户的返回值,并返回
领域服务
接收该领域中的对象为参数
组合调用领域对象完成业务功能(领域服务没有具体逻辑,只负责组合调用,具体逻辑由领域对象完成)
返回该领域中的对象给应用服务层
聚合
将一些子对象封装成一个更上层的对象
聚合封装了对象之间复杂的关系网
聚合有自己的生命周期,一般随着一次请求而创建,请求结束而销毁
工厂
我们创建一个对象是为了使用这个对象提供的功能,而不是关心这个对象是怎么生成的。所以如果把复杂的创建逻辑给对象本身自己完成,则会让对象变得很重。
版本二