领域驱动设计-聚合与聚合根


聚合根一组相关对象的集合,作为一个整体被外界访问。聚合根包含:实体、值对象。聚合根作为与外部交互的协调者,负责对聚合根内的行为进行管理,对外部屏蔽实现细节。那到底什么样的一个东西是聚合根?
购物系统里的订单、购物车,学生管理系统的学生都是聚合根实体。
订单聚合根包含:订单明细(实体)、商品(值对象)、收货地址(值对象)、订单编号、订单id等属性。大家可能会疑惑我应该如何去识别聚合根内部应该要有什么东西呢。
总结如下,封装不变性。
1.一个业务应该要有什么东西组合而成才是完整的。(一个订单必须要有收货人、订单明细才算是一个完整的订单)
2.聚合内的某些对象的状态必须满足某个业务规则。(订单明细的增加、修改、删除都会影响到订单)
举一个反例:
1.学生管理系统里学生是一个聚合根。每个学生都需要报名选修课,经老师审批过后才算报名成功。很多人第一想法就会学生聚合根里包含(选修课实体),这样设计其实是不合理的。从不变性来说,学生和选修课并没有业务规则限制,并不需要强组合在一块,如果将选修课实体放到学生聚合根里面,那学生关联的东西那么多是否都需要加塞进去呢?所以在学生报名选修课里,至少有三个聚合根分别是学生、报名、选课3个聚合根。又比如帖子和回复,他们之前存在联系,但是并不是强关联。帖子可以没有回复、删除回复也不影响帖子、编辑帖子也不会影响到回复。如果我们强行将帖子和回复放到帖子聚合根里面的话,就会面临编辑帖子的时候要去取出回复,编辑回复要去取出帖子的问题。一个帖子的回复是无穷多的。从聚合的设计原则:设计小聚合。这个必然会影响到性能。所以有时候聚合的大小也是可以作为一个拆分的依据。如果你发现聚合过多,很多时候里面肯定还隐藏这聚合根未被拆分出来导致的。帖子和回复合理的设计应该是两个分别独立的聚合根。
聚合和聚合根是封装不变性,将属于你的东西管理好。自生无法完成的通过领域、应层进行封装组合

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值