![]() |
1
9
如果我没弄错的话,你会混淆这里的缩略语。从你的问题来看,我觉得你并不是真的在问 Command and Query Responsibility Segregation 模式,但您可能会询问 Command-Query Separation 道德原则 在这种情况下 basics 简而言之: 命令
查询
我将尝试演示通用接口(及其实现)和非通用接口之间的区别。本演示中显示的类似思维方式适用于通用查询处理程序。 解决问题的技术方面通用命令处理程序接口:
其示例实现:
实例
最后是命令处理程序的示例消费者:
使用通用的优点
|
![]() |
2
5
如果查询和命令具有不同的行为约定,则应使用两个接口。 因此,充实这个问题的方法是开始考虑在每个接口中声明什么签名,以及常见的签名是否真的意味着相同的东西。 命令和查询都是不可变的;如果您仔细考虑一下,就会发现您真的不希望在运行中修改编码到命令或查询中的状态。因此,在CQS意义上,接口中的函数都应该是查询,即返回对象状态的副本而不以任何方式更改它的函数。 既然如此,命令和查询有什么共同点?也许是一堆元数据,以便调用正确类型的处理程序,以便您可以将响应与请求关联起来,等等 企业集成模式 Gregor Hohpe)。 所以你肯定可以证明
所以你可能会
取决于是否存在对所有命令通用的查询,而不是对所有消息通用的查询。您的实现可能需要
但我很难想出任何查询的例子,这些查询可能属于不属于Message的查询和命令。 另一方面,如果你正在考虑 标记接口 ,其中您实际上没有指定合同,例如:
那么我不知道你有什么理由想把它们结合起来,除非你想用
回顾您的实现,您似乎在某个地方丢失了情节。
这是一个命令“在我的记录系统中创建一组实体”,还是一个查询“向我返回创建的实体列表”?试图同时做这两件事违反了CQS,这意味着你走错了方向。 换句话说,这里的构造
这很奇怪——为什么在使用CQRS模式时会需要这样的东西? 以CreateAttachments为例,当前实现调用客户端发送命令处理程序,并接收匹配guid的列表。这很难实现,但你不必选择这样做。在客户端上生成ID并将其作为命令的一部分有什么问题?您认为客户端生成的GUID是否比服务器生成的GUIDs更不唯一?
“听着,妈,没有结果。”呼叫者只需要确认命令(这样它就可以停止发送命令);然后它可以通过查询进行同步。 |
![]() |
Gabe Tucker · 无法在golang中分配接口对象指针 2 年前 |
![]() |
randomDud · C#从另一个接口重写接口方法 2 年前 |
![]() |
evilsushi · C#接口不允许成员类满足要求 6 年前 |