想象一下,你建立一个社交网络。 还有谁可以添加其他用户作为朋友的用户。 如何在DDD模型呢? 当然,你不能简单地拥有在好友列表中User
类,因为任何朋友圈会导致从库得到这样的用户无限递归。
你将如何改变你的模型,如果你需要跟踪它可以挂起,取消,接受或拒绝好友请求?
想象一下,你建立一个社交网络。 还有谁可以添加其他用户作为朋友的用户。 如何在DDD模型呢? 当然,你不能简单地拥有在好友列表中User
类,因为任何朋友圈会导致从库得到这样的用户无限递归。
你将如何改变你的模型,如果你需要跟踪它可以挂起,取消,接受或拒绝好友请求?
嗯......其实这是很容易做到你问什么,和你的情况是一个标准。 你不必存储实际的User
对象Friendslist
您的User
总量,只是放在那里谁是朋友的用户ID的User
。
这是总执行由Vaugh弗农提出的规则之一:链接到由它们的ID其他聚合和实体。 因此,没有循环,只是ID列表。
在这种情况下再有人成为了朋友,你有一次修改两处聚集某人。 它可以是令人不快的行为,因为不能在一个事务中瞬间发生变化。 但是,对于这种情况下,你必须域事件和好友请求可以很容易地模仿:你的聚集可以互相沟通FriendshipRequested
, FriendshipAccepted
, FriendshipCancelled
或FriendshipDeclined
事件,并相应地改变它们的状态。
在这种情况下,你还会收到日志和通知是免费的。
这将在很大程度上取决于你在哪里一致性界限需要的人。 这也将因此取决于你有什么业务规则。
虽然元骑士在同一总量已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事件模型。
一个User
可以有一个列表Friend
秒。 一个Friend
可能包括用户标识的,FriendType,的GroupId等
一个User
也可以有一个列表FriendRequest
秒。 一个FriendRequest
可以有一个用户ID,RequestMessage,RequestStatus等。
User
, Friend
和FriendRequest
都可能是同一个集合的一部分。 但是可能会有一些重复这样做。 另一种选择是有参与这两个用户一个FriendRequest,并且每个用户必须接收和发送列表FriendRequest
标识。
这只是给你一些想法,因为在DDD,您的设计将很大程度上取决于你的应用程序将如何工作,以及所需要的功能。 ;-)