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