问题 如何保存和加载值对象?


由于没有值对象的存储库。 如何加载所有值对象?

假设我们正在为博客应用程序建模,我们有这些类:

  • 邮政(实体)
  • 评论(价值对象)
  • 标签(价值对象)
  • PostsRespository(Respository)

我知道当我保存一篇新帖子时,它的标签会随同它一起保存在同一个表格中。但是我如何加载所有帖子的所有标签。 PostsRespository应该有一个加载所有标签的方法吗? 我经常这样做,但我想知道别人的意见


1744
2018-02-16 23:27


起源



答案:


我正在为这个问题寻找更好的解决方案,我发现这篇文章:

http://gojko.net/2009/09/30/ddd-and-relational-databases-the-value-object-dilemma/

这篇文章很好地解释了为什么与价值对象和数据库存在很多混淆。 在这里你是一个非常喜欢我的短语:

  • 坚持不是将一切都变为实体的借口。

Gojko Adzic,给我们三个选择来保存我们的价值对象。


9
2018-02-17 23:34



关系数据库和ORM经常欺骗我们创建偶然的实体 jefclaes.be/2013/05/accidental-entities-you-dont-need-that.html - JefClaes
谢谢你的链接 - yeraycaballero
@yeraycaballero如果我在文本列中保存值对象(选项3),我该怎么做才能对值对象执行原子更新? - Po-Ying Chen


答案:


我正在为这个问题寻找更好的解决方案,我发现这篇文章:

http://gojko.net/2009/09/30/ddd-and-relational-databases-the-value-object-dilemma/

这篇文章很好地解释了为什么与价值对象和数据库存在很多混淆。 在这里你是一个非常喜欢我的短语:

  • 坚持不是将一切都变为实体的借口。

Gojko Adzic,给我们三个选择来保存我们的价值对象。


9
2018-02-17 23:34



关系数据库和ORM经常欺骗我们创建偶然的实体 jefclaes.be/2013/05/accidental-entities-you-dont-need-that.html - JefClaes
谢谢你的链接 - yeraycaballero
@yeraycaballero如果我在文本列中保存值对象(选项3),我该怎么做才能对值对象执行原子更新? - Po-Ying Chen


我目前正在研究一个类似的例子。一旦您需要唯一引用标签,它们就不再是简单的价值对象,并且可能会继续增加复杂性。我决定将它们作为自己的实体,并创建一个单独的存储库来检索它们。在大多数情况下,它们是使用帖子加载或保存的,但是当它们单独使用时,则使用其他存储库。

我希望这有帮助。

编辑: 部分归功于这篇文章,我决定稍微重组我的应用程序。你是对的,我可能错误地将标签变成了一个实体。我已经改变了我的应用程序,以便标签只是字符串,后期存储库处理标签周围的所有存储要求。对于需要帖子的操作,标签会随之加载。对于任何只需要标签或标签列表的操作,存储库都有相应的方法。


3
2018-02-17 00:27



感谢你的回答。所以你有一个TagsRepository。你在数据库中也有一个Tags表吗? - yeraycaballero
我实际上还没有确定数据库。我可能没有单独的数据库,并且正在强烈考虑像mongo或者沙发这样的对象或文档数据库解决方案。 - smaclell


以下是我如何以我正在练习DDD的方式解决这类问题。

如果您正在编辑需要添加标签的内容,例如Post,那么标签可能是实体,但也许它们可能是值对象,并且可以与帖子一起加载和保存。我个人倾向于支持值对象,除非需要修改对象但我确实意识到实体对象被建模为只读“快照”和缺乏身份的实际值对象之间存在差异。棘手的部分是,有时您通常认为的关键字可能是值对象的一部分,只要它不在该上下文中用作标识,我认为标记属于此类别。

如果您正在编辑标签本身,那么它可能是一个单独的有界上下文或至少是一个单独的聚合,其中标签本身是聚合根并通过存储库持久化。请注意,在此上下文中表示标记的实体类不必与Post聚合中使用的标记的实体类相同。

如果显示屏上的列表可用标签仅供参考,例如提供选择列表,则可能是值对象列表。这些值对象可以但不必在域模型中,因为它们主要是支持UI而不是实际域。

如果有人对我为什么采取这种做法有任何疑问,请发信息,但这就是我一直这样做的方式。


0
2017-12-03 05:02