domain-driven-design - DDD/CQRS : Combining read models for UI requirements

标签 domain-driven-design cqrs

让我们使用博客上下文的经典示例。在我们的域中,我们有以下场景:Users可以写Posts . Posts必须至少编入一个 Category . Posts可以使用 Tags 来描述. Users可以评论Posts .

四个实体( PostCategoryTagComment )被实现为不同的聚合,因为我没有检测到任何实体数据应该干扰另一个实体的规则。因此,对于每个聚合,我将有一个代表它的存储库。同样,每个聚合都通过他的 id 引用其他聚合。

在 CQRS 之后,我从这个场景中推导出了导致命令的典型用例,例如 WriteNewPostCommand , PublishPostCommand , DeletePostCommand等等......以及他们各自的查询以从存储库中获取数据。 FindPostByIdQuery , FindTagByTagNameQuery , FindPostsByAuthorIdQuery等等...

根据我们所在应用程序的哪个站点(后端或前端),我们将有或多或少复杂的查询。所以,如果我们在首页上,也许我们需要构建一些小部件来获取最后的评论、类别的最新帖子等...涉及简单 Query 的查询对象(几个搜索条件)和一个 QueryHandler非常简单(单个存储库作为对处理程序类的依赖)

但在其他地方,此查询可能更复杂。在管理面板中,我们需要在表格中显示满足复杂搜索条件的关系。可能是有趣的搜索帖子:作者姓名(无 ID)、类别名称、标签名称、发布日期...属于不同聚合和不同存储库的标准。

此外,在我们的帖子表中,我们不想将帖子与作者 ID 或类别 ID 一起显示。我们需要显示所有信息(用户名、头像、类别名称、类别图标等)。

我的问题是:

  • 在基础设施层,当我们设计存储库时,搜索方法(findAll、findById、findByCriterias...)应该返回引用所有关联 id 的相应实体?我的意思是,如果有一个方法 findPostById(uuid)findPostByCustomFilter(filter) , 应该返回一个引用它拥有的所有类别 id、所有标签 id 和作者 id 的帖子实例吗?或者我的 repo 应该有某种方法来填充给定的 post 实例与我想要的关联?
  • 如果我想搜索从 2014 年 12 月 12 日创建的、由约翰撰写的、分类为“新闻”和“视频”类别以及标签“科幻”和“冒险”的帖子,并获取每个聚合的完整详细信息,应该如何创建我的 QueryQueryHandler ?

  • a) 创建一个 Query使用我所有的参数(authorName、categoriesNames、TagsNames,如果想要检索 UserCategoryTag 关联完整详细)然后他的 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/

    相关文章:

    c# - CQRS 读取端 ORM 还是纯 ADO.NET?

    c# - 没有服务定位器的 CQRS 调度程序

    c# - 订单ID分配在哪里?

    domain-driven-design - 数据传输对象、域对象和存储库

    domain-driven-design - 你如何处理 DDD 中聚合之间的关联?

    cqrs - CQRS 事件存储的结构

    .net-core - CQRS 是 saga/process manager 同步执行一组相关命令的最佳方法吗?

    java - OOP中的设计建议

    java - 用领域驱动设计实现分页和排序

    domain-driven-design - Lightbend 响应式(Reactive)架构认证