DDD项目落地之充血模型实践 | 京东云技术团队
背景:
充血模型是DDD分层架构中实体设计的一种方案,可以使关注点聚焦于业务实现,可有效提升开发效率、提升可维护性;
1、DDD项目落地整体调用关系
调用关系图中的Entity为实体,从进入领域服务(Domin)时开始使用,直到最后返回。
2、实体设计
充血模型是实体设计的一种方法,简单来说,就是一种带有具体行为方法和聚合关联关系的特殊实体;
关于实体设计,需要明白的关键词为:领域服务->聚合->聚合根->实体->贫血模型->充血模型
聚合与聚合根:
聚合是一种关联关系,而聚合根就是这个关系成立的基础,没有聚合根,这个聚合关系就无法成立;
举个例子,存在3个实体:用户、用户组、用户组关联关系,这3个实体形成的关联关系就是聚合,而用户实体就是这个聚合中的聚合根;
实体:
定义在领域层,是领域层的重要元素,从领域划分到工程实践落地,都应该围绕实体进行,DDD中的实体和数据库表不只是1对1关系,可能是1对多或者仅为内存中的对象;
贫血模型:
实体不带有任何行为方法,也不带有聚合关联关系,作用基本相当于值对象(ValueObject),仅作为值传递的对象,和传统三层项目架构中的实体具有相同作用,不建议使用。补充说明:一般我们使用的DTO就可以被当做是值对象
充血模型:
实体中带有具有行为方法和聚合关联关系,行为方法是说create、save、delete等封装了一类可以指代行为的方法,比如在用户实体对象中具有用户组实体的引用,这样当我们需要操作用户组时,只通过用户实体进行操作就可以。
工程实践中,建议采用充血模型,好处是隐藏胶水代码,提升代码可读性,使关注点聚焦于业务实现。
充血模型在实践中的问题:
行为代码量过多,导致实体内部臃肿膨胀,难以阅读,难以维护,对于这种问题,我们需要根据实体行为的代码量多少来采取不同的解决方案。
解决方案:
场景1:行为不会导致实体臃肿的情况下,在实体中完成行为定义
public CooperateServicePackageConfig save() { // 直接调用基础设施层进行保存 cooperateServicePackageConfigRepository.save(this); return this; }
场景2:行为导致实体臃肿的情况下,采用外部定义行为的方式,核心思想是借助其他类实现行为代码定义,将臃肿代码外移,保留干净的实体行为:
1)创建工具类,将某个实体中的行为定义其中,实体负责调用该工具类
public CooperateServicePackageConfig save() { // 将处理过程放在工具类中 ServicePackageSaveUtils.save(this); return this; }
2)创建新实体,将该实体的使用场景明确至某个细分行为,比如一个聚合根(ExampleEntity)的保存可能涉及到5个实体的保存,那么我们定义一个ExampleSaveEntity实体,专门用来处理该聚合下的保存行为
实践经验:
1、关于spring bean注入:充血模型在实体中使用静态注入方法实现。例:
private LabelInfoRepository labelInfoRepository = ApplicationContextUtils.getBean(LabelInfoRepository.class);
2、充血模型的实体序列化,排除非必要属性,在一些redis对象缓存时可能会用到。例:
// 使用注解排除序列化属性 @Getter(AccessLevel.NONE) private LabelInfoRepository labelInfoRepository = ApplicationContextUtils.getBean(LabelInfoRepository.class);
// 使用注解排除序列化属性 @JSONField(serialize = false) private ServicePackageConfig servicePackageConfig;
// 使用注解排除序列化 get 方法 @Transient @JSONField(serialize = false) public static CooperateServicePackageRepositoryQuery getAllCodeQuery(Long contractId) { CooperateServicePackageRepositoryQuery repositoryQuery = new CooperateServicePackageRepositoryQuery(); repositoryQuery.setContractIds(com.google.common.collect.Lists.newArrayList(contractId)); repositoryQuery.setCode(RightsPlatformConstants.CODE_ALL); return repositoryQuery; }
3、利用Set方法建立聚合绑定关系。例:
public void setServiceSkuInfos(List<ServiceSkuInfo> serviceSkuInfos) { if (CollectionUtils.isEmpty(serviceSkuInfos)) { return; } this.serviceSkuInfos = serviceSkuInfos; List<String> allSkuNoSet = serviceSkuInfos .stream() .map(one -> one.getSkuNo()) .collect(Collectors.toList()); String skuJoinStr = Joiner.on(GlobalConstant.SPLIT_CHAR).join(allSkuNoSet); this.setSkuNoSet(skuJoinStr);}
作者:京东健康 张君毅
来源:京东云开发者社区

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
TIOBE 8 月榜单:Julia 首次进入前 20 名
TIOBE 公布了 2023年 8 月的编程语言排行榜。 Julia 在本月榜单中实现历史性突破,成功跻身TIOBE 指数前 20 名。Julia 诞生于大约 13 年前,是一种非常年轻的编程语言;尤其适用于数据科学和数学计算领域。 TIOBE CEOPaul Jansen 认为,促使Julia 突破重围的独特之处在于,它比 Python 更快、比 R 更适合编写大型系统、且比 Matlab 成本更低。“因此,速度、可扩展性和开源性使 Julia 成为一个有吸引力的选择。另一方面,Julia 比提到的其他 3 种语言需要更多的编程技能;因此,它能否在 'big boys' 之间保持自己的地位令人拭目以待。” 此外,COBOL 自上月重新进入Top 20 名后,本月排名继续攀升至榜单第 15 位。 TIOBE 8 月 TOP 20 编程语言 PHP 由上月的榜单第 9 跌至第 10;Assembly language 挤掉MATLAB 重回Top 10,排名从第 14 上升到第 9,MATLAB 则下降至第 13 位。 除此之外的一些其他排名变化有: Scratch的排名从 12 升至 ...
- 下一篇
大语言模型推理性能优化之七策
编者按:随着大语言模型在自然语言处理中的广泛应用,如何提高其在实际部署中的推理速度成为一个非常关键的问题。 本文详细介绍了当前提高大语言模型推理速度的七大策略,包括使用低精度计算、模型量化、使用适配器微调、采用模型剪枝、批量推理、多 GPU 并行和采> 用其他推理优化工具等方法。这些方法各有利弊,作者通过具体的实例说明它们的使用效果,让读者比较清晰地了解当前这一领域的技术发展情况。 本文内容丰富全面,对那些想要将大语言模型应用到实际产品中的工程师有很强的参考价值。读者可以通过本文找出适合自己场景的推理优化策略,也可以进一步深入了解这一领域的最新进展。推荐对落地大语言模型应用感兴趣的读者阅读本文。 以下是译文,Enjoy! 作者| Sergei Savvov 编译 | 岳扬 Image generated with Stable Diffusion 各类公司,不论是小型创业公司还是大型企业,都希望好好利用现代化的大语言模型,并将其融入到公司的产品和基础软件中。然而,这些公司一般都将遇到一个挑战:这些大模型在部署(推理)时需要消耗大量的算力资源。 加快模型推理速度已经成为开发者们所面...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- 2048小游戏-低调大师作品
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- CentOS8编译安装MySQL8.0.19
- CentOS6,CentOS7官方镜像安装Oracle11G
- CentOS7,8上快速安装Gitea,搭建Git服务器
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- Red5直播服务器,属于Java语言的直播服务器