Welcome to WuJiGu Developer Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
482 views
in Technique[技术] by (71.8m points)

领域驱动 多对多建模问题

领域驱动里面说,要避免多对多的关系,但是现在有一个场景不知道该如何处理

场景如下:
用户可以拥有多个支付账号,同时可以新建多个支付类别
例如用户A:

  • 拥有:支付宝账号、微信账号、各种银行卡账号……
  • 拥有支付类别:日常消费、房贷专用、车贷专用……

用户在支付账号管理页面,可以快捷的批量添加与删除该支付账号隶属于哪些支付类别,
用户也在支付类别管理页面,可以批量的添加和删除关联的支付账号

这个场景下领域建模怎么处理
应该是账号做聚合根,还是类别做聚合根

做无论是哪个做聚合根在做批量处理的时候,怎么查询到对应的聚合根对象


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

应该是三个聚合根,建议读一下实现领域驱动设计一书,尽量设计小聚合根!
三个聚合根分别是账户、支付类型、账户与类型关联关系(用户不考虑,这里用户应该是值对象)。聚合是业务中的最小数据单元,也就是你在进行操作时聚合是一个整体的概念。
从上面的描述,支付类型明显是作为一个单独的业务进行的管理,它的改变并不在账户的业务范围内,所以是聚合根。账户是聚合根这不用进行讨论。
他们之间的关联关系是聚合根,并且只持有账户跟支付类型的唯一标识(聚合根不要直接引用,而是通过标识进行关联),这个聚合根的意义是为了持久化,为账户添加或删除支付类型,属于领域服务,因为这个操作既不是账户的行为也不是支付类型的行为。通过这个中间聚合根就将账户跟支付类型的多对多关系关联起来,并且这些操作并不是账户或者支付类型本身的行为,应该设计成无状态的领域服务。
对于订单与订单明细为什么都作为一个聚合呢?因为脱离了订单的订单明细是没有意义的,他们是一个业务整体。而上面的支付类型与账户很明显不是这样的关系。


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to WuJiGu Developer Q&A Community for programmer and developer-Open, Learning and Share
...