如何在不违反命令和查询端分离的情况下基于元数据在 CQRS 中构建查询

Posted

技术标签:

【中文标题】如何在不违反命令和查询端分离的情况下基于元数据在 CQRS 中构建查询【英文标题】:How do I build a query in CQRS based on metadata without violating separation of command and query side 【发布时间】:2015-09-06 15:14:04 【问题描述】:

我查看了这些帖子,但没有找到合适的答案:

CQRS: Read model built on demand?

CQRS - The query side

CQRS: business logic on the query side

我对基于 CQRS 的架构感到困惑。我知道查询端应该有一个精简的数据访问层,但是在我的项目中,我需要根据来自其他域对象的元数据来调整查询。

在互联网上的几篇文章中,报告数据库中的每个视图都有一个表。因此,您只需要一个像“SELECT * FROM Tablename WHERE...”这样的 SQL 命令。这在这里不合适,因为查询返回的列应该是可定制的(通过列过滤器)。

这应该如下工作:

    查询由客户端调用,包含行的过滤器 ID(WHERE 部分)和列的另一个过滤器 ID(SELECT 部分)。 QueryHandler 根据从域服务中提取的信息(基于两个过滤器的 ID)构建 SQL 查询 对数据库执行查询并将结果返回给客户端

我正在努力解决的是第 2 步中对域服务的依赖。对我来说,由于查询和命令端之间的分离,这不应该是这样。

这是处理这个问题的一种可接受的方法,还是有另一种方法可以将这两个方面分开?

【问题讨论】:

【参考方案1】:

我认为在您的第三个链接问题中给出的Dennis's answer 可能说得最好 - 报告可以是与您域的其他部分不同的有界上下文。如果您可以争辩说您存储的过滤器与您的主域是分开的,那么您仍然在该主域上保持分离。

您的读取端有一些逻辑,这不是问题。在这种情况下,您不会更改要返回的数据的含义。您没有硬编码的主域的业务逻辑。您拥有的逻辑是不同有界上下文的一部分,您不一定要使用 CQRS 建模(即使是 CQRS 的最大支持者也会告诉您,您不应该在任何地方都使用 CQRS)。

【讨论】:

以上是关于如何在不违反命令和查询端分离的情况下基于元数据在 CQRS 中构建查询的主要内容,如果未能解决你的问题,请参考以下文章

如何在不违反 MVVM 原则的情况下处理拖放?

如何在不违反主键约束的情况下插入具有循环引用的实体框架

如何在不违反 CSP 的情况下绑定剃须刀视图中的 onchange 等事件

如何进行前后端分离

什么是前后端分离?为什么分离

GraphQL 是不是适合在不进行多次查询的情况下从后端检索多级 facet 数据?