DDD和均质许多一对多的关系(DDD and Homogeneous Many-to-Many Re

2019-08-16 20:29发布

想象一下,你建立一个社交网络。 还有谁可以添加其他用户作为朋友的用户。 如何在DDD模型呢? 当然,你不能简单地拥有在好友列表中User类,因为任何朋友圈会导致从库得到这样的用户无限递归。

你将如何改变你的模型,如果你需要跟踪它可以挂起,取消,接受或拒绝好友请求?

Answer 1:

嗯......其实这是很容易做到你问什么,和你的情况是一个标准。 你不必存储实际的User对象Friendslist您的User总量,只是放在那里谁是朋友的用户ID的User

这是总执行由Vaugh弗农提出的规则之一:链接到由它们的ID其他聚合和实体。 因此,没有循环,只是ID列表。

在这种情况下再有人成为了朋友,你有一次修改两处聚集某人。 它可以是令人不快的行为,因为不能在一个事务中瞬间发生变化。 但是,对于这种情况下,你必须域事件和好友请求可以很容易地模仿:你的聚集可以互相沟通FriendshipRequestedFriendshipAcceptedFriendshipCancelledFriendshipDeclined事件,并相应地改变它们的状态。

在这种情况下,你还会收到日志和通知是免费的。



Answer 2:

这将在很大程度上取决于你在哪里一致性界限需要的人。 这也将因此取决于你有什么业务规则。

虽然元骑士在同一总量已FriendRequest我把它当作自己的,并使用事件因此聚集制作人并没有FriendRequests最终一致性之间的通信。 这将允许你这样做。

public class DomainRouter {
    public void When(FriendRequestCreated event)
    {
            //Send command to each Person to record request
    }

    public void When(FriendRequestAccepted event)
    {
            //Send command to Person to record request accepted and add friend.
            //Send comamnd to Person who accepted to add Friend
    }

    public void When(FriendRequestDeclined event)
    {
            //Send command to update Friend request on person.
            //Send command to Person who declined to record they have declined?
    }
}

因此,对人的有关信息也只是状态的记录。 该FriendRequest总结会,所有的过程实际上发生。

什么是DDD重要的是要考虑水煤浆。 一个FriendRequest可以要求,撤销,接受和拒绝。 有什么可以一个人呢? 的一个人必须DDDD或者你可以把它简单地进行CRUD +店信息到图形数据库等。

也许你想它的方式,你可以去person.requestFriendAcceptance(人ID),在这种情况下,路由器很可能只是通知FriendRequest的朋友处理FriendRequestCreated事件模型。



Answer 3:

一个User可以有一个列表Friend秒。 一个Friend可能包括用户标识的,FriendType,的GroupId等

一个User也可以有一个列表FriendRequest秒。 一个FriendRequest可以有一个用户ID,RequestMessage,RequestStatus等。

UserFriendFriendRequest都可能是同一个集合的一部分。 但是可能会有一些重复这样做。 另一种选择是有参与这两个用户一个FriendRequest,并且每个用户必须接收和发送列表FriendRequest标识。

这只是给你一些想法,因为在DDD,您的设计将很大程度上取决于你的应用程序将如何工作,以及所需要的功能。 ;-)



文章来源: DDD and Homogeneous Many-to-Many Relationship