领域驱动设计之聚合与聚合根实例一

通过一个实例来说明如何划分聚合与聚合根

场景:一个下订单的业务,一个订单必须有相应的客户信息,订单下有订单项,每个订单项必须有相应的产品信息,产品有分类的信息。

1.根据这个基本的需求,我们初步确定的实体、值对象与关联关系为(这里采用EF的Model First):

2.经过业务深入分析,以及聚合与聚合根确定原则,最终我们确定的聚合与聚合根是(红色代表聚合根,蓝色代表聚合内的实体,灰色代表值对象):

划分与确定理由 1.订单、客户与产品都可以在不同的领域被独立访问到,所以应该是属于不同聚合的聚合根。

2.订单初看好像要依赖于客户才能存在,其实不然,一是订单的生命周期与客户的生命周期不是一致的,二是订单与客户之间也没有不变的一致性规则。

3.订单只需要下订单那个时刻客户的姓名、电话与地址等相关信息,所以作了一个值对象保存那个时刻的客户相关信息,因可能业务上需要通过订单查询客户当前的信息,所以做了一个客户ID关联到客户对象。

4.订单项也只需要那个时刻的产品的名称、单价等信息,所以作了一个值对象保存那个时刻的产品相关信息,因可能业务上需要通过订单项查询产品当前的信息,所以作了一个产品ID关联到产品对象。

5.产品初看好像要依赖于产品类别,实际上产品类别只是对产品的一种划分,所以产品类别做成值对象,如果业务上要对某个产品类别进行促销等业务逻辑,则产品类别应该划为一个单独聚合的聚合根。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏WeTest质量开放平台团队的专栏

双十一临近,电商产品如何保持最优的性能体验?

十一月临近,一年一度的电商大戏“双十一”又将隆重出场,目前各大商家已经开始各类优惠券的发放,各类大促的商品表单也已经提前流出,即将流入各个用户的购物车中。

13420
来自专栏杨建荣的学习笔记

推荐一款任务调度的开源方案

在平时的工作中,我们多多少少会有一些定时任务需要处理,有些是在每个服务器上单独部署,有些是在中控端部署,但是这样有一个缺点就是难以形成闭环,我们不知道我们的定时...

43470
来自专栏罗超频道

移动搜索和应用分发可以做朋友?搜内容会推荐应用

谷歌面向Android平台推出了一项新的移动搜索功能,可以在用户搜索内容时向其展示移动应用安装广告。 这相当于把谷歌移动搜索页面变成一个应用发现服务,对于移动开...

31960
来自专栏开源优测

从小白到菜鸟:持续集成说

1.1引言 持续集成的价值是什么?对于开发和测试人员又意味着什么呢? 1.2概念 “持续集成”一词来源与极限编程(Extreme Programming),...

47180
来自专栏Java架构师进阶

一个程序员对架构的认识

架构是一个系统的草图(逻辑+物理角度),它是有生命的,随着业务的变化会不断演进。没有完美的架构只有合适的架构。

11330
来自专栏DevOps时代的专栏

大规模团队如何采用标准化的持续交付模式

序言 传统软件项目交付中,各个角色分工明确,也暴露了很多软件交付中的很多问题。 DevOps的工作方式恰如其分的解决了其中一些问题,那么如何从传统交付流程迁移到...

33480
来自专栏DevOps时代的专栏

无服务器化的微服务持续交付

前言 我在刚进入 ThoughtWorks 的时候就做微服务,当时不知道什么叫做微服务,只是我们通过一个小的技术应用替换原先的大应用的一个部分,当时只是做一个解...

42160
来自专栏BestSDK

产品经理与测试工程师的5点根本区别

相对设计和开发来说,测试工程师是产品经理接触较少的一类人群,因为测试人员往往也是躲在项目幕后,默默地奉献着自己,确保产品能够正常运行。产品测试是很重要的一个环节...

33940
来自专栏Rainbond开源「容器云平台」

干货下载:谷歌、亚马逊等十大公司微服务案例精选

30640
来自专栏云计算D1net

如何与多个云供应商更好的合作

企业在与多个云供应商合作之前,需要评估他们的计算,存储,安全性,以及更多的服务。 企业必须从多个云提供商中进行选择。亚马逊网络服务公司无疑是最大的行业巨头,而微...

37590

扫码关注云+社区

领取腾讯云代金券