领域驱动里面说,要避免多对多的关系,但是现在有一个场景不知道该如何处理
场景如下:
用户可以拥有多个支付账号,同时可以新建多个支付类别
例如用户A:
- 拥有:支付宝账号、微信账号、各种银行卡账号……
- 拥有支付类别:日常消费、房贷专用、车贷专用……
用户在支付账号管理页面,可以快捷的批量添加与删除该支付账号隶属于哪些支付类别,
用户也在支付类别管理页面,可以批量的添加和删除关联的支付账号
这个场景下领域建模怎么处理
应该是账号做聚合根,还是类别做聚合根
做无论是哪个做聚合根在做批量处理的时候,怎么查询到对应的聚合根对象
###应该是三个聚合根,建议读一下实现领域驱动设计一书,尽量设计小聚合根!
三个聚合根分别是账户、支付类型、账户与类型关联关系(用户不考虑,这里用户应该是值对象)。聚合是业务中的最小数据单元,也就是你在进行操作时聚合是一个整体的概念。
从上面的描述,支付类型明显是作为一个单独的业务进行的管理,它的改变并不在账户的业务范围内,所以是聚合根。账户是聚合根这不用进行讨论。
他们之间的关联关系是聚合根,并且只持有账户跟支付类型的唯一标识(聚合根不要直接引用,而是通过标识进行关联),这个聚合根的意义是为了持久化,为账户添加或删除支付类型,属于领域服务,因为这个操作既不是账户的行为也不是支付类型的行为。通过这个中间聚合根就将账户跟支付类型的多对多关系关联起来,并且这些操作并不是账户或者支付类型本身的行为,应该设计成无状态的领域服务。
对于订单与订单明细为什么都作为一个聚合呢?因为脱离了订单的订单明细是没有意义的,他们是一个业务整体。而上面的支付类型与账户很明显不是这样的关系。