Sna*_*akE 4 domain-driven-design
想象一下您建立了一个社交网络。有些用户可以添加其他用户为好友。您如何在 DDD 中对此进行建模?当然,您不能简单地在类中拥有一个朋友列表User,因为任何朋友循环都会导致从存储库获取此类用户时的无限递归。
如果您需要跟踪可能待处理、取消、接受或拒绝的好友请求,您将如何更改您的模型?
嗯...实际上按照你的要求做很容易,而且你的情况是标准的。您不必将实际User对象存储在聚合中Friendslist,User只需将User.
这是 Vaugh Vernon 提出的聚合实现规则之一:通过 ID 链接到其他聚合和实体。所以没有循环,只有 ID 列表。
在这种情况下,某人成为某人的朋友,您必须同时更改两个聚合。这可能是不受欢迎的行为,因为更改不可能在一笔事务中立即发生。但对于这种情况,您可以轻松建模领域事件和好友请求:您的聚合可以使用FriendshipRequested、FriendshipAccepted或事件相互通信,并相应地更改其状态。FriendshipCancelledFriendshipDeclined
在这种情况下,您还可以免费接收日志和通知。