该场景下如何选择聚合根?如何处理Ticket与Scheduled movie关联不违反聚合规则
DDD 跨聚合实体关联合规解决方案
遵循「聚合仅能通过其根从外部被引用」的领域驱动设计规则,可按以下方案处理Ticket和Scheduled movie的关联问题:
- 用唯一标识符替代对象引用
禁止Ticket实体直接持有Scheduled movie的实体对象引用,仅存储ScheduledMovieId(排片唯一ID)即可。直接引用Movie聚合的内部子实体会打破聚合边界,导致Scheduled movie的状态可能被外部聚合随意修改,破坏Movie聚合的事务一致性规则。 - 跨聚合关联合法性校验通过根实体完成
涉及Ticket关联排片的合法性校验(比如排片是否存在、是否处于可售票状态)时,通过Movie聚合根查询对应ID的Scheduled movie状态,所有对Scheduled movie的访问都必须经过Movie根实体中转,禁止直接调用Scheduled movie的内部方法。 - 必要场景下做不可变字段冗余
如果业务中需要频繁在Ticket相关流程中读取排片的基础信息,可在Ticket实体中冗余存储Scheduled movie的不可变公共字段,比如放映时间、影厅编号、对应影片名称等,避免高频跨聚合查询。如果冗余字段存在更新需求,需通过领域事件实现最终一致性,保证两个聚合的数据对齐。 - 跨聚合联动通过领域事件实现
当Scheduled movie的状态发生变更(比如场次取消、放映时间调整)时,由Movie聚合根发布对应领域事件,TicketReservation聚合订阅事件后,批量处理关联Ticket的作废、退票等逻辑,两个聚合完全解耦,不存在内部实体的直接依赖。 - 可选:调整聚合划分适配核心业务流
如果你的业务核心流程中,排片的绝大多数操作都围绕售票、退票展开,也可以调整聚合边界,将Scheduled movie升级为独立的聚合根,Movie实体作为Scheduled movie的关联属性,此时Ticket直接引用Scheduled movie根实体的ID就完全符合聚合设计规则。
内容的提问来源于stack exchange,提问作者m_kr
相关产品推荐
相关产品推荐

