如果我要构建一个用户可以仅共享帖子的社交网络,我会将用户建模为实体,而将帖子建模为值对象的集合。
但是,其他用户可以喜欢 Facebook 中的帖子。帖子可以有评论。其他用户也可以喜欢评论。
我一直读到,实体具有我们关心的身份,但值对象则不然。
引入评论和点赞的概念在一定程度上提高了帖子的重要性。现在我需要确定哪个评论与哪个帖子相关。同样,我需要确定哪个用户喜欢哪个帖子或评论。
如果我有 2 个帖子的措辞完全相同“此处有一些虚拟帖子” ,但是第一个被 User1 和 User2 喜欢,而第二个被 User3 和 User4 喜欢,那么我应该得出结论,这些是不同的帖子。但是,仅比较帖子的身份会更容易。
TL;DR
引入与值对象的关系是否会将其提升为实体?
最佳答案
让我们澄清一下:
- 实体始终有一个 ID,因为您希望识别它们,而不管它们的其他值如何。
- 值对象(VO)封装了一个值并且是可以互换的,你不关心对象,你只关心值。您使用 VO 而不仅仅是值(假设它不是复合值)的原因是 VO 始终处于有效状态并“保证”您正在使用有效值。
从 VO 到实体没有晋升,他们应该从一开始就对正确的领域概念进行建模。
在您的场景中,帖子、评论和用户始终是实体。帖子没有评论,they are associated with comments 。 喜欢是用户、帖子和评论的用例。
您将拥有一个 LikesTracker 或类似的工具,它将用户的点赞与帖子或评论相关联。
我不同意@Alexey Raga 建议的结构,因为它是错误的(CRUD)建模。首先,User 和 Post 是聚合根,而不是聚合(表示一组上下文相关的概念)。我不明白为什么 Like 应该是 VO,但无论如何,Like 和 Comments 的集合不是 Post 概念定义的一部分,它们不属于那里。
该结构对于读取( View )模型有意义,但对于域模型则不然。
关于c# - 识别 Facebook 域模型中的实体和值对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20568613/