在DomainDrivenDesign中搜索查询和搜索结果

时间:2015-12-14 02:10:51

标签: domain-driven-design

我有一个带有新闻帖子的网络应用程序。这些新闻帖子应该是可搜索的。 在DDD的上下文中,搜索查询和搜索结果是什么类型的构建块?

这些是我的想法

他们都没有身份,因此他们不是实体。但缺乏身份并不意味着它们是价值对象。正如Eric Evans所说:

  

但是,如果我们认为这类对象只是缺乏身份,那么我们的工具箱或词汇量就不会增加太多。实际上,这些对象具有自己的特征以及它们对模型的重要意义。 这些是描述事物的对象。

我想说两者都是价值对象,但我不确定。令我困惑的是我在互联网上找到的例子。 Usualy价值对象是其他实体的一部分,它们不是独立的"。 Martin Fowler给出了Money或日期范围对象。 Adam Bien事件将它们与枚举进行比较。

如果搜索结果被视为值对象,那么它将是由实体组成的值对象。我不确定这完全没问题。

我不认为它们是DataTransferObject。因为我们目前不关心在层之间传输数据,但是我们关注它们在没有层的情况下对模型的意义。

我认为搜索查询不是命令。因为它不是变更请求。 如CQRS

所述
  

人们通过发送命令请求对域进行更改。

我试图使用和学习DDD,有人可以向我澄清这个问题吗?我在哪里推理错误了?

1 个答案:

答案 0 :(得分:4)

简单的答案是查询可能不属于您的域名。域模型不用于提供查询,它可以在您的域中强制执行不变量。因为本质上查询是只读的,所以没有不变量来强制执行,那么为什么复杂化呢?我认为DDD人们通常出错的地方在于他们认为因为他们正在做DDD"系统的每个方面都必须由域模型处理。 DDD可用于帮助处理复杂的业务规则,只应在实际拥有它们的时间/地点应用。此外,您可以并且可能应该有许多模型来支持每个有界上下文。但这是另一场讨论。

您提到CQRS很有意思,因为它代表什么?命令查询责任隔离。因此,如果命令使用域模型,并且查询责任与此分离,那么它会告诉您什么?答案是,做最容易查询和显示数据的事情。如果从填充到数据集的新闻表中选择*,请使用它。如果你更喜欢实体框架,那就去吧。没有必要让域模型参与查询。

我想说的最后一点是,我认为很多人都在努力应对DDD,因为它应用于没有很多业务不变量来执行的情况,域模型最终看起来很多像数据库。确保您使用正确的工具来完成工作而不是过度复杂化。此外,您应该只在存在这些不变量的系统区域中应用DDD。这不是全有或全无的情况。