kr8*_*r85 3 domain-driven-design
我有一个包含新闻帖子的网络应用程序。这些新闻帖子应该是可搜索的。在 DDD 的背景下,搜索查询和搜索结果是什么样的构建块?
它们都没有身份,因此它们不是实体。但缺乏身份并不意味着它们是值对象。正如埃里克·埃文斯所说:
然而,如果我们认为此类对象只是缺乏身份,那么我们就没有在我们的工具箱或词汇中添加太多内容。事实上,这些对象都有自己的特点和对模型的意义。这些是描述事物的对象。
我想说两者都是价值对象,但我不确定。让我困惑的是我在互联网上找到的例子。通常值对象是其他实体的一部分,它们不是“独立的”。Martin Fowler给出了例如 Money 或日期范围对象。Adam Bien事件将它们与枚举进行比较。
如果搜索结果被视为值对象,那么它将是由实体组成的值对象。我不确定这完全没问题。
我不认为它们是 DataTransferObject。因为我们当前不关心层之间传输数据,但我们关心它们在没有层的情况下对模型的意义。
我不认为搜索查询是命令。因为这不是要求改变。正如CQRS上所述
人们通过发送命令来请求对域进行更改。
我正在尝试使用和学习 DDD,有人可以向我澄清这个问题吗?我的推理哪里出了问题?
简单的答案是查询可能不是您的域的一部分。域模型不是为了服务查询,而是为了在域中强制执行不变量。由于查询本质上是只读的,因此没有强制执行的不变量,那么为什么要把事情复杂化呢?我认为人们在使用 DDD 时通常会犯的错误是,他们认为既然他们在“执行 DDD”,系统的每个方面都必须由领域模型来处理。DDD 可以帮助处理复杂的业务规则,并且只应在您实际拥有这些规则的时间/地点应用。此外,您可以而且可能应该有许多模型来支持每个有界上下文。但这是另一个讨论了。
有趣的是,您提到了 CQRS,因为它代表什么?命令查询责任分离。因此,如果命令使用域模型,并且查询责任与其分离,那么这会告诉您做什么?答案是,采取最简单的方式来查询和显示该数据。如果 select * from news tablefilled to dataset 有效,那就这样做。如果您更喜欢实体框架,请选择它。查询时不需要涉及领域模型。
我想指出的最后一点是,我认为很多人都在努力应对 DDD,因为他们将 DDD 应用于没有太多业务不变量需要执行的情况,并且域模型最终看起来很像数据库。确保您使用正确的工具来完成工作,而不是让事情变得过于复杂。另外,您应该只在系统中存在这些不变量的区域应用 DDD。这不是一个全有或全无的情况。
| 归档时间: |
|
| 查看次数: |
824 次 |
| 最近记录: |