最近有空会跟同事讨论DDD架构的实践落地的情况,但真实情况是,实际中对于领域驱动设计中的实体,值对象,根,领域事件这些战术类的实践落地,每个人理解依然因人而异,大概率是因为这些概念还是有一些抽象,同时有有别于传统的MVC架构开发。
在此,通过小demo的方式跟大家分享一下我对DDD中战术层级的理解,算是抛砖引玉,该理解仅代表我个人在现阶段的一个理解,也可能未来随着业务经验深入,还会有不同的理解。
既然说是小demo,还是要从业务场景出发,也就是我最熟知的电商业务场景说起。但是该篇文章里, 我会简化一些实际业务场景中的复杂度,通过最小颗粒度的demo,来反映实践过程中的基本问题。
话不多说,我先抛出我自己假设的一个业务场景,就是我们熟知的电商网站下单购物的场景。具体细节如下:
• 订单创建事件:当用户下单时触发该事件,包含订单信息、商品信息等数据。
• 订单支付事件:当用户完成支付时触发该事件,包含订单信息、支付金额等数据。
• 订单发货事件:当商家发货时触发该事件,包含订单信息、快递公司、快递单号等数据。
• 商品聚合根:包含商品实体和相关的值对象,负责商品的创建、修改、查询等操作。
• 订单聚合根:包含订单实体和相关的值对象,负责订单的创建、修改、查询等操作。
• 创建订单接口:用户提交购买请求后,系统创建相应的订单,并触发订单创建事件。
• 支付订单接口:用户完成支付后,系统更新订单状态,并触发订单支付事件。
该demo中,商品和订单是两个核心领域概念,分别由对应的聚合根负责管理。同时,通过定义领域事件,实现了不同业务场景下的数据更新和通知。最后,对外提供了一组简单的接口服务,方便系统的使用和扩展。
好了,有了以上我们对业务场景的充分剖析,确定了子域,接下来我们该写我们的代码。
通过以上demo,对于实体和值对象,大家会很好理解,并且很直观。但是, 我额外想重点解释一下聚合根和领域事件的概念
从上面的demo可以看出,在合根类中,我们定义了商品和订单的增、删、查等操作,并且为订单定义了创建订单、支付订单、发货等业务逻辑代码。
聚合根是一个对象,它代表一组相关联的对象的整体。在聚合根内部,可以包含多个实体对象和值对象。聚合根通常可以通过唯一标识符来进行识别和访问。它是整个聚合的管理者,负责维护聚合之内的一致性,并协调各个实体对象之间的关系。聚合根通常具有丰富的行为和操作,可以对聚合内部的对象进行复杂的操作。
所以说,真正的聚合根内的方法是基于充血模型封装的,而不是仅仅是对对象的数据封装。在聚合根中,对象不仅封装了数据,还包含了相应的行为和业务逻辑。这意味着在一个聚合根中,对象可以自己处理自己的业务逻辑,而不需要外部的控制。就如同demo中所写的那样,订单对象可能包含一些关于订单处理和交付的方法,如确认订单、取消订单、发货等。
领域事件是DDD中最重要的概念之一,他是解决子域之间耦合的重要手段,因为它们提供了一种将领域概念和业务语言转化为代码的方法。当一个领域事件发生时,它会触发一些操作,这些操作可能会更改系统的状态,也可能会导致其他领域事件的发生。通过对领域事件进行建模,我们可以更好地了解业务过程并设计出更加符合实际需求的系统。
2.相关数据:这些数据包含了事件发生时与事件相关的所有信息。例如,在一个电子商务系统中,如果订单被提交,则订单信息以及买家和卖家的信息都应该包括在该事件中。
3.发送者和接收者:发送者通常是触发事件的对象,接收者则是事件处理的对象。
领域事件在DDD中有很多用途。例如,它们可以用来触发其他业务流程、更新数据库或通知其他子系统。它们还可以用于解决一些复杂的业务逻辑问题,例如并发、数据同步和错误处理等等。
总之,领域事件是DDD架构中非常重要的概念,它可以帮助我们更好地理解业务过程,设计出更加符合实际需求的系统,并提高系统的可维护性和可扩展性。
玩转FPGA》吴厚航北京航空航天大学出版工程师项目实战演习的案例分析,更具实践价值。(3)《Verilog 数字系统设计教程》夏宇闻
玩转FPGA,作者吴厚航,由北京航空航天大学出版社出版。本书收集整理了作者在FPGA学习和实践中的经验点滴。书中既有日常的学习笔记,对一些常用设计技巧和方法进行
过采样原理在ADXL345上的实现、配置步骤、数据处理及噪声考虑因素,以提高其输出分辨率
HarmonyOS Next 应用元服务开发-分布式数据对象迁移数据权限与基础数据
《DNESP32S3使用指南-IDF版_V1.6》第二十六章 INFRARED_RECEPTION实验
【RA-Eco-RA4E2-64PIN-V1.0开发板试用】RA4E2使用之SHA256加密解密