领域驱动分层实践

发布时间 2024-01-04 20:28:15作者: mick0802

一、分层参考
infrastructure
--client
--common
--event
--api
--util

application.service
xxxService (聚合层服务,领域服务编排)

domain
leave
--entity
--valueobject(包含结构体,枚举等)
xxDomainObject(唯一标识,字段,方法 return this 操作属性集合)
--event
xxEvent
xxEventType
--repository
facade
xxInterface
mapper
xxDao
persistence
xxRepositoryImpl
po
xxPO
--service
xxService(返回具体的领域对象)
xxFactory (领域对象与PO对象转换)

interfaces
--assembler (领域对象与DTO转换)
--dto
--facade
xxApi

---------------------------------------
xxDomainObject示例

@Data
public class Leave {

String id;
Applicant applicant;
Approver approver;
LeaveType type;
Status status;
Date startTime;
Date endTime;
long duration;
//审批领导的最大级别
int leaderMaxLevel;
ApprovalInfo currentApprovalInfo;
List<ApprovalInfo> historyApprovalInfos;

public long getDuration() {
return endTime.getTime() - startTime.getTime();
}

public Leave addHistoryApprovalInfo(ApprovalInfo approvalInfo) {
if (null == historyApprovalInfos)
historyApprovalInfos = new ArrayList<>();
this.historyApprovalInfos.add(approvalInfo);
return this; //重点返回this
}

xxEvent示例

@Data
public class LeaveEvent extends DomainEvent {

LeaveEventType leaveEventType;

public static LeaveEvent create(LeaveEventType eventType, Leave leave){
LeaveEvent event = new LeaveEvent();
event.setId(IdGenerator.nextId());
event.setLeaveEventType(eventType);
event.setTimestamp(new Date());
event.setData(JSON.toJSONString(leave));
return event;
}
}


common.event
@Data
public class DomainEvent {

String id;
Date timestamp;
String source;
String data;
}

xxService示例

@Transactional
public void submitApproval(Leave leave, Approver approver) {
LeaveEvent event;
if ( ApprovalType.REJECT == leave.getCurrentApprovalInfo().getApprovalType()) {
//reject, then the leave is finished with REJECTED status
leave.reject(approver);
event = LeaveEvent.create(LeaveEventType.REJECT_EVENT, leave);
} else {
if (approver != null) {
//agree and has next approver
leave.agree(approver);
event = LeaveEvent.create(LeaveEventType.AGREE_EVENT, leave);
} else {
//agree and hasn't next approver, then the leave is finished with APPROVED status
leave.finish();
event = LeaveEvent.create(LeaveEventType.APPROVED_EVENT, leave);
}
}
leave.addHistoryApprovalInfo(leave.getCurrentApprovalInfo());
leaveRepositoryInterface.save(leaveFactory.createLeavePO(leave));
leaveRepositoryInterface.saveEvent(leaveFactory.createLeaveEventPO(event));
eventPublisher.publish(event);
}

xxApi示例

@GetMapping("/findFirstApprover")
public Response findFirstApprover(@RequestParam String applicantId, @RequestParam int leaderMaxLevel) {
Person person = personApplicationService.findFirstApprover(applicantId, leaderMaxLevel);
return Response.ok(PersonAssembler.toDTO(person));
}