实现领域驱动

article/2025/8/9 7:32:16

什么是领域驱动?

领域驱动设计 (domain-driver-design) 是有别于MVC开发模式的一种思想,它是面向对象编程的一种表现形式,请记住:领域驱动是一种思想,而不是技术!
领域驱动核心是通过对模型抽象出属性和行为进行开发。
如果没有数据库?

为什么使用领域驱动?

1、建立统一语言,为了团队更好的沟通。
2、通过模型来表达需求,模型是模块化、可扩展、易于维护的。
3、业务实现和技术实现隔离。
4、通过建模达到解耦的目的

领域驱动中的一些概念

1、统一语言
2、领域实体(聚合根)
在这里插入图片描述
3、值对象(value-object)
4、模型(失血模型、充血模型、胀血模型)
5、边界上下文
6、领域知识
7、领域事件

层级划分

常规分层结构图
1、表现层
2、应用服务层
3、领域层(领域实体和领域服务)
4、基础设施层(仓储、工具、rpc、第三方api)

通过一个 用例来展现领域驱动

一个登陆业务:
1、用户(User)输入账号(account)和密码(password)。
2、需要校验account和password正确性。
3、“7天未登陆” 或者 “更换设备”需要手机(phone)验证码(captha)校验。
4、登陆成功后做一些操作(比如:发个推送消息、做一条记录)

 public UserLoginInfoRespDto login(UserLoginReqDto userLoginReqDto) {User user = userService.doLogin(userLoginReqDto);userRepository.updateUserData(user);String token = authService.createToken(user.getUserId(), user.getUserData().getDeviceId());//查询更新后的用户信息UserLoginInfoRespDto userLoginInfoRespDto = userAssembler.assemblerUserLoginInfo(userService.getWithFormsAndNotNull(user.getUserId()));userLoginInfoRespDto.setLoginToken(token);domainEventPublisher.publish(new UpdateResourcesEvent(this,Lists.newArrayList(user.getUserData().getUserName()),userLoginInfoRespDto.getUserId(),ResourceModeType.LOGIN.getValue()));return userLoginInfoRespDto;}
 public User doLogin(UserLoginReqDto loginReqDto) {String userName = loginReqDto.getUserName();String deviceId = loginReqDto.getDeviceId();String captcha = loginReqDto.getCaptcha();String regChatId = baiduAIApiService.faceQuery(userName);if (StringUtil.isEmpty(regChatId)) {throw new BusinessException(ResponseStatus.USER_IS_NOT_REG);}User regUser = Optional.ofNullable(userRepository.getByChatId(regChatId)).orElseThrow(() -> new BusinessException(ResponseStatus.USER_IS_NOT_REG));regUser.validateNotLoginForLongTime();regUser.validateChangeDevice(deviceId,captcha);regUser.updateLoginData(loginReqDto);return regUser;}

让你的getter/setter丰满起来

领域驱动中,模型的getter/setter是可以具有逻辑的

public List<UserForm> getUserForms() {if (this.userForms == null) {if (this.userId == null) {this.userForms = new ArrayList<>();} else {this.userForms = SpringBeanUtils.getBean(IUserRepository.class).getForms(this.userId);}}return this.userForms;}

让应用层参与协调

应用层是很薄的一层,不包含任何逻辑,仅用于协调和发布命令

 public Object prePay(PayReqDto payReqDto) {Fund fund = new Fund(payReqDto);payBizFactory.handleBiz(fund);Object prePayResult = payTypeFactory.prePay(fund);//保存日志时保存为负数fund.setUserFund(-fund.getUserFund());fundRepository.add(fund);return prePayResult;}

领域实体和领域服务

整个domain层都是逻辑的封装,domain是独立的,不能被其他层侵入,持久化通过接口隔离。
何时使用领域服务?

  • 领域行为需要多个领域实体参与协作
  • 领域行为与状态无关
  • 领域行为需要与外部资源(尤其是DB)协作

面向资源库

把数据库(文件、nosql或者是其他持久化库)看作是一个集合,领域实体是其中的一个元素,整体持久化

    @Overridepublic void add(User user) {UserDataEntity dataEntity = userConverter.convertUserDataEntityFromUser(user);userDataJpaRepo.save(dataEntity);user.setUserId(dataEntity.getUserId());UserInfoEntity infoEntity = userConverter.convertUserInfoFromUser(user);userInfoJpaRepo.save(infoEntity);UserAppendEntity appendEntity = new UserAppendEntity();appendEntity.setUserId(user.getUserId());appendEntity.setPhone(infoEntity.getPhone());if (dataEntity.getRegType() == RegisterType.WX.getValue()) {appendEntity.setPhone(dataEntity.getUserName());}userAppendJpaRepo.save(appendEntity);UserEngagementAwardEntity awardEntity = userConverter.convertEngagementAwardFromUser(user);userEngagementAwardJpaRepo.save(awardEntity);}

领域层隔离带来的问题

领域对象展示和持久化需要进行转换,Assembler 和 Translater

通过测试来快速验证模型

    @Testpublic void testLogin(){User user = userService.getWithFormsAndNotNull(68L);user.validateNotLoginForLongTime();}

领域驱动是银弹吗?

如果你只是做一个简单的CRUD系统,我并不推荐。用这个思想开发起来并不快,而且具有一定的门槛。
不要生搬硬套其中的概念,灵活运用。
领域驱动的乐趣在于领域划分、建模,应对复杂业务变化。

题外话

设计模式、微服务划分


http://chatgpt.dhexx.cn/article/BJ0svGO1.shtml

相关文章

浅析 DDD 领域驱动设计

一、前言 最近公司一场有关于领域驱动设计的技术分享会&#xff0c;主要讲解了服务的划分&#xff0c;Restful API的设计&#xff0c;如何将抽象具有统一业务的范畴的Model&#xff0c;使其模块化&#xff0c;同时能够提炼组合多个模块&#xff0c;使得业务能够独立服务化&…

领域驱动设计-架构篇

目录 1、软件架构概述 1.1 软件架构概念 1.2 软件架构分类 1.3 软件架构模式 1.4 软件架构风格 2、领域驱动软件架构 2.1 架构风格 六边行架构&#xff08;领域驱动设计首选&#xff09; 为什么选择REST架构 松耦合 可伸缩性 易用性 约束性 2.2 架构模型 命令和…

DDD领域驱动设计

DDD领域驱动设计是什么 1 DDD是什么&#xff1f; DDD是领域驱动设计&#xff0c;是Eric Evans于2003年提出的&#xff0c;离现在有17年。 2 为什么需要DDD 当软件越来越复杂&#xff0c;实际开发中&#xff0c;大量的业务逻辑堆积在一个巨型类中的例子屡见不鲜&#xff0c;…

【领域驱动设计】三分钟搞懂领域驱动设计

今天的企业应用程序无疑是复杂的&#xff0c;并依赖一些专门技术&#xff08;持久性&#xff0c;AJAX&#xff0c;Web服务等&#xff09;来完成它们的工作。作为开发人员&#xff0c;我们倾向于关注这些技术细节是可以理解的。但事实是&#xff0c;一个不能解决业务需求的系统对…

领域驱动设计(DDD,Domain-Driven Design)

领域驱动设计 前言正文领域驱动设计基本概念什么是领域模型&#xff1f;什么是领域服务&#xff08;Domain Service&#xff09;&#xff1f;什么是领域事件&#xff1f; 秒杀项目中的领域分析一、秒杀活动领域设计秒杀活动领域模型领域服务领域事件 二、秒杀品领域设计领域模型…

领域驱动(自己理解)

代码层级编写规范 1、什么是领域驱动&#xff1f; 核心是维护一个反应领域概念的模型&#xff0c;然后通过大量模式来指导模型设计与开发。 一般过程&#xff1a;通过产品同学所写出的prd&#xff0c;利用领域模型的概念与业务相结合&#xff0c;完善出xmind&#xff0c;现在…

DDD领域驱动设计详解

DDD领域驱动设计详解 1. 领域驱动概述1.1 领域驱动简介1.2 领域驱动优点1.3 领域驱动解决复杂度方式1.4 领域驱动疑问 2. 领域驱动核心知识2.1 领域知识概念2.2 领域战略战术设计 3. 领域驱动战略设计3.1 战略设计概述3.2 领域与子域3.3 限界上下文3.4 领域场景分析3.5 四色建模…

领域驱动介绍

大纲 软件设计发展史什么是领域驱动设计领域驱动设计解决什么问题领域驱动设计包含哪些要素领域驱动设计的架构样例分析 软件设计发展史 单体->前后端->微服务->服务网格 SSH->ssm->spring boot-> SideCar/ Istio 单体 早期功能侧重功能实现 ESB 基于服…

阿里云负载均衡简介和购买使用流程

目录 一&#xff0c;阿里云负载均衡简介 二&#xff0c;阿里云准备工作 三&#xff0c;阿里云负载均衡原理和说明 四&#xff0c;阿里云负载均衡应用场景说明 五&#xff0c;阿里云负载均衡特点和优势 六&#xff0c;阿里云负载均衡应用场景 七&#xff0c;总结 一&…

阿里云负载均衡【SLB】使用实践方案

负载均衡&#xff08;Server Load Balancer&#xff0c;下文简称 SLB&#xff09;的引入&#xff0c;可以降低单台云服务器 ECS&#xff08;下文简称 ECS&#xff09;出现异常时对业务的冲击&#xff0c;提升业务的可用性。同时&#xff0c;结合弹性伸缩服务&#xff0c;通过动…

阿里云负载均衡

1.环境搭建 准备两台ECS 然后在ECS中配置http服务 yum install httpd -y echo "this is wwq2"> /var/www/html/index.html 2.负载均衡 进入负载均衡控制台 创建负载均衡实例 配置监听 并且添加服务器 测试

使用阿里云负载均衡SLB还需要自己配置Nginx吗?

购买阿里云负载均衡SLB后&#xff0c;还需要自己设置Nginx吗&#xff1f;不需要&#xff0c;阿里云负载均衡SLB本身就是流量转发产品&#xff0c;不需要自己配置Nginx进行流量转发。负载均衡SLB将访问流量根据转发策略分发到后端多台云服务器ECS实例上&#xff0c;提高应用可用…

阿里云负载均衡实验

1.创建ECS 2.开放80端口 3.安装httpd起服务 yum install httpd -y echo " web passage.hostname -I" > /var/www/html/index.html //hostname -I 查看IP地址 systemctl start httpd [rootiZbp10x14xc3r5wy59stlkZ ~]# curl localhost web passage.172.18.180.10…

阿里云负载均衡SLB,HTTPS动态网站部署负载均衡,实现高并发流量分发

第一步购买服务器&#xff0c;测的话一般就用按量付费几毛钱一小时 我是用了三台&#xff0c;一台是常用的服务器&#xff0c;两台临时服务器进行部署项目 2&#xff1a;服务器购买完之后&#xff0c;开始安装项目运行环境&#xff0c;我是宝塔一键按键的&#xff0c;PHP7.1。…

阿里云培训-负载均衡(CLB/ALB)

什么是传统型负载均衡CLB 传统型负载均衡CLB&#xff08;Classic Load Balancer&#xff09;是将访问流量根据转发策略分发到后端多台云服务器&#xff08;ECS实例&#xff09;的流量分发控制服务。CLB扩展了应用的服务能力&#xff0c;增强了应用的可用性。 概述 CLB通过设…

阿里云SLB负载均衡

阿里云SLB负载均衡 四层和七层是什么意思调度算法轮询(RR)加权最小连接数(WLC)加权轮询(WRR) 会话保持健康检查 四层和七层是什么意思 四层: 通过IP和端口转发 七层&#xff1a;通过主机名和域名转发 四层就是 TCP 和 UDP;七层就是http和https. 调度算法 轮询(RR) 假定有2台…

阿里云负载均衡理论

目录 负载均衡概念 总结: CLB与ALB 负载均衡包含的模块 使用ECS的优势 负载均衡的使用场景 SLB的优势 SLB提供的功能 SLB的应用场景 负载均衡概念 负载均衡(Server Load Balancer&#xff09;是将访问流量根据转发策略分发到后端多台云服务器&#xff08;ECS实例)的流量…

阿里云cdn以及阿里云负载均衡配置方法

阿里云cdn以及阿里云负载均衡配置方法 1、阿里云CDN1、全站加速1、添加域名2、配置cname3、配置服务器访问4、配置https 2、阿里云负载均衡配置1、创建负载均衡2、将域名解析到负载均衡的ip中3、添加后端服务器4、配置监听规则5、https 1、阿里云CDN 一开始请先注意全站加速和…

阿里云负载均衡配置

目录 1.创建负载均衡实例 2.配置监听 3.添加后端服务 4.绑定域名 记录工作日记&#xff0c;避免忘记&#xff0c;欢迎大家在文章下方和我留言&#xff01; 1.创建负载均衡实例 阿里云工作台->负载均衡->实例管理 2.配置监听 点击对应实例后面的配置监听&#xff0…

【云服务器 ECS 实战】一文掌握负载均衡服务原理及配置方法

一、负载均衡基本原理概述协议/端口轮询策略会话保持 二、云服务器 ECS 负载均衡相关配置协议&监听配置后端服务器配置健康检查配置测试 在上期文章中&#xff0c;介绍了负载均衡的概述及优势&#xff0c;并详细演示了阿里云服务器负载均衡服务的选型与购买配置。本期文章我…