问题标签 [command-query-separation]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - 是否返回违反 CQS 原则的任务?
- CQS 原则 ( https://en.wikipedia.org/wiki/Command%E2%80%93query_separation ) 规定命令应返回 void。
- 异步方法的建议是永远不要返回 void ( https://msdn.microsoft.com/en-us/magazine/jj991977.aspx ),而是返回一个任务。
那么,如果我编写一个异步命令,是否会不可避免地破坏 CQS 原则?
asp.net-mvc - 从命令运行查询是否违反命令-查询分离?
给定一个真实的匿名购物车,“AddToCart”工作流程必须执行以下步骤:
- 从数据库中查找当前产品。从产品中获取价格或使用服务来计算用户选择和其他产品属性的价格。(询问)
- 从数据库中查找当前的购物车。(询问)
- 如果数据库中不存在当前购物车,则创建一个新的购物车实体(在内存中)。
- 将新商品(产品)及其价格添加到购物车实体(在内存中)。
- 在整个购物车上运行任何折扣计算。(取决于查询)
- 在购物车上运行任何销售税计算。(取决于查询)
- 在购物车上运行任何运输计算。(取决于查询)
- 如果这是一个新的购物车,则将该实体添加到数据库中,否则更新数据库中的购物车。(命令)
因此,尽管“AddToCart”听起来应该是一个命令(因为它会更新系统状态),但实际上它依赖于许多查询。
我的问题
处理此类工作流的普遍接受的方法是什么?
- 创建一个
AddToCartCommandHandler
依赖于可能运行查询的其他服务。 - 制作一个外观
CartService
来编排首先运行查询的工作流,然后是命令。 - 使控制器操作方法首先运行查询,然后运行任何命令。如果需要重用,似乎可能会错过一些查询步骤。
- 其他?
我找不到答案的原因是因为它“取决于设计”,这是不应用它的例外情况之一?
如果命令和查询是分开的,我是否会将我的真实实体框架实体类传递给添加/更新购物车的命令(以便 EF 可以确定它是否已附加)?在这种情况下,DTO 似乎不会这样做。
注意:我隐含地假设实现这些系统
CQS
的目的是最终它们可以成为一个完整的CQRS
系统。如果是这样,这个工作流程显然无法进行过渡 - 因此我的问题。
背景
我正在 CQS 进行我的第一次尝试。
从我读过的有关此模式的文档中可以清楚地看出,查询不得更改系统状态。
但是,目前尚不清楚是否可以从命令中运行查询(我似乎无法在任何地方找到任何信息)。
我可以想到几个现实世界的案例需要发生这种情况。但是,鉴于在线上缺乏这种模式的真实示例,我不确定如何进行。网上有很多理论,但我能找到的唯一代码是here和here。
domain-driven-design - 域驱动设计中 CQRS 实现中命令/查询的单独应用程序服务?
在使用领域驱动设计实现 CQRS 时,我们将命令接口与查询接口分开。
我的理解是,在域级别,这会显着降低域模型中的复杂性(尤其是在使用事件溯源时),您的读取模型将不同于您的写入模型。因此,对于您的读写有界上下文,这看起来像是一个单独的域服务。
在应用层面,我们是否需要一个单独的应用服务来实现我们域的读写分离?
在这件事上我一直在扮演魔鬼的拥护者。我的想法是它可能是矫枉过正,要求客户知道其中的区别。但后来我想到了一个消费网络服务如何使用它。一般来说,它会发出读取请求和写入请求,这意味着它已经知道了。
我看到了更清洁的应用程序服务的好处。
c# - 没有参数的 CQS
在 CQS(命令查询分离)中,通常有带有“void”返回值的命令和带有返回类型的查询。(或者我已经学会了......)
现在我想知道这个命令是否有效,因为基本上,我们正在做与查询相同的事情,只是使用“out”关键字而不是使用返回类型:
java - 使用 Spring / Hibernate 的 CQS 模式
我正在开发一个遵循( ) 模式的 //应用程序Java
。Spring
Hibernate
CQS
Query Command Separation
简单地说:
- 我们
domain model
仅用于Commands
描述需要在域模型上完成的一些操作; - 所有读取操作都由
QueryService
绕过的a 完成,domain model
因此它可以根据用例优化(使用projection
)每个查询。
域模型通过使用映射到MySQL
数据库Hibernate
。
我知道关于域和持久性模型之间的分离存在长期争论。但是,我相信现在 Hibernate 已经变得如此灵活,以至于您不必在域模型上做出艰难的牺牲。这样,您就不会在域和持久性模型之间获得一对一的映射。此外,所有与 DB 相关的东西都可以通过使用层超类型抽象出来。
我的问题:
- 如果我在我的 中使用
Hibernate
Query
(或Criteria
)使用投影,我QueryService
实际上是在使用我的域模型而不是普通的 SQL。这不是违反CQS
模式吗……? - 我可以选择在我的
QueryService
. 是否有任何好的 SQL 框架让我能够在不使用域模型的情况下构建查询并将结果轻松绑定到 JavaBeans 中?结果通常是图表,因此很容易将它们绑定到一些嵌套的 JavaBean 结构。
domain-driven-design - 对与其他领域的交互感到困惑
我们正在为一个全新的domain model
(和Bounded Context
)“ Appointment
”创建一个新的应用程序。我们选择为我们的新域结合CQS
(Hexagonal Architecture
使用端口和适配器)。
我们的包结构主要是这样的:
我的问题:
- 这个包结构是否适合我们想要实现的目标?
我们希望通过该
AppointmentScheduleFacade
接口查看与其他域之间的每一次通信。跨域通信以普通方法调用(没有 RPC 或 REST)的形式存在,因为它们不是分布式的。门面主要代表:
AppointmentScheduleApplicationService.java
用于模型修改AppointmentScheduleQueryService.java
用于将数据传递到其他域。
这个设置好吗?或者其他域是否应该直接与Application
and对应QueryService
?
c# - 属性似乎在方法调用之间发生变化,但没有代码应该改变它
我有一个Octet
类应该“打包”八个样本,然后将它们发送出去。它具有添加新样本、检查其是否已满以及Frame
从Octet
.
该类Octet
抛出两种异常:“无法提取,因为尚未满”和“无法添加样本,因为已经满”。为此,客户端代码应在调用之前检查是否已满Add
,并在已满时立即提取,并重置它(老实说,这是一个很蹩脚的类合约)。
问题是:我得到了两种错误,即使客户端类 - 唯一使用的Octet
- 似乎在抛出的操作之前正确地执行了检查,但即使错误条件被击中。更糟糕的是,当我在调试器中断时检查值时,它们是正确的,也就是说,不应该抛出异常!
c# - 不能隐式转换类型 Systems.Collection.Generic.List到 Proj.Areas.Management.Models.FeedEventViewModel
我正在尝试将视图模型转换为列表,然后将其返回到视图,但我得到了不能隐式转换类型错误。
代码:
在这种情况下我做错了什么?
entity-framework - CQS 和更新现有实体
我只是想弄清楚如何使用 CQS 更新实体。假设 UI 允许用户更新特定实体的多个属性,并在提交时,在后端创建并调度更新命令。
我不太了解的部分是:
- cmd 处理程序是否从调度程序接收消息然后从数据库中检索现有实体,然后将接收到的库存项目属性映射到然后保存?或者
- 是否在发送 cmd msg 之前完成了对现有项目的检索,然后将其附加到它(检索到的附加到 cmd 的实体,然后发送)?
我的理解是,CQS 允许稍后更轻松地过渡到 CQRS(如有必要)?那是对的吗?
如果是这种情况,上面 2 的问题是可以从一个看起来与命令/写入模式非常不同的模式检索查询。我错过了什么吗?