因为没有值对象的存储库。如何加载所有值对象?
假设我们正在为一个博客应用程序建模,并且我们有以下类:
- 帖子(实体)
- 注释(值对象)
- 标签(值对象)
- PostsRespository(存储库)
我知道当我保存新帖子时,它的标签会与它一起保存在同一个表中。但是我怎么能加载所有帖子的所有标签。PostsRespository 应该有加载所有标签的方法吗? 我通常这样做,但我想知道别人的意见
因为没有值对象的存储库。如何加载所有值对象?
假设我们正在为一个博客应用程序建模,并且我们有以下类:
我知道当我保存新帖子时,它的标签会与它一起保存在同一个表中。但是我怎么能加载所有帖子的所有标签。PostsRespository 应该有加载所有标签的方法吗? 我通常这样做,但我想知道别人的意见
我正在为这个问题寻找更好的解决方案,我发现了这篇文章:
http://gojko.net/2009/09/30/ddd-and-relational-databases-the-value-object-dilemma/
这篇文章很好地解释了为什么值对象和数据库存在很多混淆。这是你太喜欢我的短语了:
Gojko Adzic,给我们三个替代方案来保存我们的值对象。
我目前正在研究一个类似的例子。一旦您需要唯一引用标签,它们就不再是简单的值对象,并且可能会继续变得复杂。我决定让它们成为自己的实体,并创建一个单独的存储库来检索它们。在大多数情况下,它们与帖子一起加载或保存,但当单独需要它们时,会使用其他存储库。
我希望这有帮助。
编辑:部分感谢这篇文章,我决定稍微重组我的应用程序。你是对的,我可能错误地使标签成为实体。我已经更改了我的应用程序,以便标签只是字符串,并且发布存储库处理标签周围的所有存储要求。对于需要发布的操作,标签会与它们一起加载。对于任何只需要标签或标签列表的操作,存储库都有相应的方法。
以下是我对如何以我目前正在练习 DDD 的方式解决此类问题的看法。
如果您正在编辑需要从 Post 中添加和删除标签的内容,那么标签可能是实体,但也许它们可能是值对象,并且以任何一种方式与 post 一起加载和保存。除非需要修改对象,否则我个人倾向于支持值对象,但我确实意识到建模为只读“快照”的实体对象与缺乏标识的实际值对象之间存在差异。棘手的部分是,有时您通常认为的键可能是值对象的一部分,只要它在该上下文中不用作身份,我认为标签属于这一类。
如果您正在编辑标签本身,那么它可能是一个单独的有界上下文或至少一个单独的聚合,其中标签本身是聚合根并通过存储库持久保存。请注意,在此上下文中表示标签的实体类不必与 Post 聚合中使用的标签的实体类相同。
如果您在显示器上列出可用标签用于只读目的(例如提供选择列表),那么这可能是值对象列表。这些值对象可以但不必位于域模型中,因为它们主要是关于支持 UI 而不是关于实际域。
如果有人对为什么我对此的看法可能是错误的有任何想法,请插话,但这就是我一直在做的事情。