让我们使用博客上下文的经典示例。在我们的域中,我们有以下场景:Users
可以写Posts
. Posts
必须至少编入一个 Category
. Posts
可以使用 Tags
来描述. Users
可以评论Posts
.
四个实体( Post
、 Category
、 Tag
、 Comment
)被实现为不同的聚合,因为我没有检测到任何实体数据应该干扰另一个实体的规则。因此,对于每个聚合,我将有一个代表它的存储库。同样,每个聚合都通过他的 id 引用其他聚合。
在 CQRS 之后,我从这个场景中推导出了导致命令的典型用例,例如 WriteNewPostCommand
, PublishPostCommand
, DeletePostCommand
等等......以及他们各自的查询以从存储库中获取数据。 FindPostByIdQuery
, FindTagByTagNameQuery
, FindPostsByAuthorIdQuery
等等...
根据我们所在应用程序的哪个站点(后端或前端),我们将有或多或少复杂的查询。所以,如果我们在首页上,也许我们需要构建一些小部件来获取最后的评论、类别的最新帖子等...涉及简单 Query
的查询对象(几个搜索条件)和一个 QueryHandler
非常简单(单个存储库作为对处理程序类的依赖)
但在其他地方,此查询可能更复杂。在管理面板中,我们需要在表格中显示满足复杂搜索条件的关系。可能是有趣的搜索帖子:作者姓名(无 ID)、类别名称、标签名称、发布日期...属于不同聚合和不同存储库的标准。
此外,在我们的帖子表中,我们不想将帖子与作者 ID 或类别 ID 一起显示。我们需要显示所有信息(用户名、头像、类别名称、类别图标等)。
我的问题是:
findPostById(uuid)
或 findPostByCustomFilter(filter)
, 应该返回一个引用它拥有的所有类别 id、所有标签 id 和作者 id 的帖子实例吗?或者我的 repo 应该有某种方法来填充给定的 post 实例与我想要的关联? Query
和 QueryHandler
? a) 创建一个
Query
使用我所有的参数(authorName、categoriesNames、TagsNames,如果想要检索 User
、Category
、Tag
关联完整详细)然后他的 QueryHandler
将不同的读取模型集成在一个中。或者...b) 创建不同的
Queries
(FindCategoryByName、FindTagByName、FindUserByName)然后我的网络 Controller 稍后调用它们调用 FindPostQuery 但现在将其他查询返回的 authorid、categoryid、tagid 传递给他?
b) 解决方案看起来更干净,但似乎更贵。
最佳答案
SearchCriteria
对其进行建模。目的。该对象与技术无关,但它会被传递到您的查询端数据访问对象,该对象将知道如何组合条件来为其所针对的特定数据存储构建较低级别的查询。 关于domain-driven-design - DDD/CQRS : Combining read models for UI requirements,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33521064/