使用 CQRS 在 DDD 中进行命令验证

2024-01-17

我正在学习 DDD 并利用 CQRS 模式。我不明白如何在不从数据存储中读取的情况下验证命令处理程序中的业务规则。

例如,克里斯想给阿什利一件礼物。

该命令可能是 GiveGiftCommand。

我什么时候才能验证克里斯确实拥有他想要赠送的礼物?如果不从数据库读取数据,我该如何做到这一点?


关于命令处理程序中的验证存在不同的观点和意见。

Command 可以被拒绝, 我们可以说No如果该命令无效。

通常,您会在 UI 上进行验证,并且可能会在命令处理程序中重复(有些人也倾向于将其放在域中)。然后,命令处理程序可以运行可以在实体外部发生的简单验证,例如数据格式是否正确、是否存在预期值等。

另一方面,业务逻辑不应该在命令处理程序中。它应该在您的域中。

所以我认为根本的问题是......

我应该从命令处理程序查询读取端吗?

我会说不。不要在命令处理程序或域逻辑中使用读取模型。但是你可以随时从客户端查询您的读取模型获取命令所需的数据并验证命令。您可以查询客户端的读取端,以检查克里斯是否确实拥有他想要赠送的礼物。当然,涉及读取模型的验证可能最终是一致的,这当然是命令处理程序内的聚合被拒绝的另一个原因。

有些人不同意这样的说法:如果您要求命令包含处理程序验证命令所需的数据,那么您永远无法在不影响客户端的情况下更改处理程序/域中的验证逻辑。这向客户暴露了太多的领域知识,并且违背了客户只想表达意图的事实。所以他们倾向于提供一个GiftService接口(这是通用语言的一部分)到您的命令处理程序,然后根据需要实现该接口 - 这可能包括查询读取端。

我认为客户端应该始终假设它发出的命令会成功。不需要调用读取端来验证命令。获得两个相互矛盾的命令的可能性很小(用户使用相同的电子邮件地址创建帐户)。然后您应该有一种方法来发出纠正措施,例如 Saga/Process Manager。因此,如果命令可以被验证并且首先不被发送,那么采取纠正措施就会减少问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 CQRS 在 DDD 中进行命令验证 的相关文章

  • 身份验证和用户任务

    我正在考虑开发一个具有明确定义域的系统 主要基于网络 域的一部分包括像这样的实体Diary Booking Customer etc 不过我创建了另一个名为User其目的仅用于身份验证和授权 污染Customer具有特定于身份验证的数据的实
  • 使用 Spring 验证框架验证请求标头

    是否可以将 Spring 验证框架与 Spring MVC 结合使用来验证 HTTP 请求标头的存在和值 要检查presence请求标头的 您不需要验证框架 请求标头参数默认是强制的 如果请求中缺少强制标头 Spring MVC 会自动响应
  • 如何降低圈复杂度?

    我正在开发一个将 RequestDTO 发送到 Web 服务的类 我需要在发送请求之前验证该请求 请求可以从 3 个不同的地方发送 并且每个 请求类型 有不同的验证规则 例如请求1必须有姓名和电话号码 请求2必须有地址等 我有一个 DTO
  • 有没有办法调用 VBA(MS Access 2002 或 2003)中任何控件的 BeforeUpdate 事件过程?

    在 VBA 中 我正在更改 Access 表单中的一些控件的值 我喜欢在执行此操作后运行这些控件的 BeforeUpdate 事件 因为它会检查字段之间的一致性 Private Sub ExampleProc1 Dim intCancel
  • 在 Spring 中为 @Pathvariable 添加类级别验证

    在发布这个问题之前 我已经做了很多研究并尝试了很多可用的解决方案 这是我陷入的棘手情况 我有一个 Spring 控制器 它有多个请求映射 它们都有 PathVariables 控制器如下所示 Controller EnableWebMvc
  • 定时任务应该放在哪一层?

    我正在尝试使用分层架构来实现 DDD 应用程序 我有 基础设施层 实现应用程序的技术特定部分的层 领域层 包含领域模型的层 应用层 包含与领域模型交互的干扰的层 接口层 从外部接收事件的层 经典的 3 层 基础设施 架构非常清晰 但我的应用
  • 构建动态 ConstraintViolation 错误消息

    我写了一个由自定义实现的验证注释ConstraintValidator 我也想生成非常具体的ConstraintViolation使用消息插值期间验证过程中计算的值的对象 public class CustomValidator imple
  • WPF 中列表框的数据验证

    我有一个 ListBox 绑定到类型 T 的 ObservableCollection 每个 ListBoxItem 都是一个复选框 IsChecked 绑定到 T 中的 bool 属性 我想验证 ListBox 中的选中项 以便至少必须选
  • 验证美国的电话号码是否存在

    我想用 C 验证美国的给定电话号码 是否有任何API或其他东西可以帮助程序员验证电话号码存在 我不仅想验证它们是否与美国电话号码的格式匹配 还想验证它们的存在 提前致谢 您可以使用正则表达式验证电话号码格式 例如 但为了验证该电话号码是否确
  • 禁用视图中所需的验证特定字段 ASP.NET MVC 4

    如果有人能给我一些提示 我将不胜感激 我搜索了一段时间 我什至找到了一个帖子 我认为它可以解决我的问题 但它没有 在某些情况下禁用必需的验证属性 https stackoverflow com questions 5367287 disab
  • 对一组复选框使用 HTML5“必需”属性?

    使用支持 HTML5 的较新浏览器 例如 FireFox 4 时 并且表单字段具有属性required required 并且表单字段为空 空白 然后点击提交按钮 浏览器检测到 必填 字段为空 并且不提交表单 相反 浏览器会显示一条提示 要
  • 仅当表单已提交时才触发 jQuery 表单验证?

    不引人注目的验证基于这样的想法 don t进行表单验证 直到用户提交表单 一旦发生这种情况 如果表单上的某些内容无效 那么一旦用户更改了每个字段 就会立即验证它 我想做的是 不显眼地 触发表单元素的验证 也就是说 only如果用户已尝试提交
  • 在网页上的文本框中键入内容时删除所有空格

    我如何在用户打字时即时删除输入到文本框中的空格 function var txt myTextbox var func function txt val txt val replace s g txt keyup func blur fun
  • RegularExpressionValidator 限制输入长度而不限制字符类型

    我正在尝试使用RegularExpressionValidator验证一个TextBox输入长度 我可以使用它 但它只接受字母和数字 我想允许any个字符 唯一的检查是不超过 25 个字符
  • 使用 CQRS 处理中介管道中的错误/异常?

    我正在努力追随这个帖子 https lostechies com jimmybogard 2014 09 09 tackling cross cutting concerns with a mediator pipeline 由 Jimmy
  • html5 输入模式属性在表单之外不起作用?

    这把小提琴 http jsfiddle net 2gaw3 按预期工作 当用户输入无效的国家 地区代码时 它会显示警告 这另一个小提琴 http jsfiddle net y66vH 4 没有form元素 不起作用 看来输入的pattern
  • Jquery 表单验证 - 电话号码

    我已经在表单上设置了 jQuery 验证 该验证当前测试电话号码字段不为空并且是一个数字 但我希望它能够处理用户在手机 区号后放置空格的情况 谁能建议我需要做什么才能允许这样做 这是我当前的代码 if phone length 0 name
  • 如何检查用户电子邮件的唯一性并将结果传递给 jQuery?

    我有这个问题 我正在控制器中检查用户电子邮件并发送 json 成功响应 如果已获取 并添加输入的 css 样式 我还需要阻止提交并添加一些消息 这是我的检查电子邮件操作 使用本文 http paydrotalks com posts 45
  • jQuery 验证 - 只显示一条错误消息

    使用 jQuery 验证插件时 有没有办法只显示抛出的最新错误消息 我认为你应该调查一下groups and errorPlacement的选项validate方法 这应该适合你 jQuery 验证 validate 选项 http doc
  • 表单帖子上的 asp.net mvc 编码

    我在我的 asp net mvc 表单 带有文本区域的 nicedit 中使用富文本编辑器 当我在帖子上提交表单时 因为它不是 html 编码的 我收到以下消息 从客户端检测到潜在危险的 Request Form 值 如何对 post 上的

随机推荐

  • 如何使用 AWS CDK 标记 EBS 卷?

    我正在使用 AWS CDK 创建带有 EBS 卷的实例 BlockDevice durableStorage BlockDevice builder deviceName dev sdf volume BlockDeviceVolume e
  • Scrapy tbody标签返回一个空答案,但里面有文本

    我尝试废弃并抓取一个网站 数据位于 tbody 标记 事件名称 中 当我检查谷歌控制台时 tbody标签有文本数据 但是当我尝试废弃它时 它返回一个空答案 也在scrapy shell中进行了测试 我检查了 AJAX 方法 因为它可以使脚本
  • 为什么宏扩展有时会加一个空格?

    如果我这样做 define F a F It expands to a godbolt https gcc godbolt org z reGxqz 如果我这样做 define F F It expands to with a space
  • Swift 将字节数组转换为字符串

    我无法将下面的字节数组快速转换为字符串 let chars UInt8 255 255 255 255 255 255 255 255 255 255 255 255 0 0 0 0 let datastring NSString data
  • 使用 mysqli_query 的长文本最大内存错误

    我工作的公司使用Kayako https www kayako com 管理其支持票证 我准备制作一个外部网络应用程序 它可以获取一家公司的所有门票并显示历史记录 我使用 mysqli query 连接到数据库 link mysqli co
  • 将数组添加到 web.config 中的键

    我想知道是否可以将数组作为键中的值 示例
  • 在 postgresql 中查找现有函数脚本的命令是什么?

    由于我们使用 sp helptext 过程名称 来获取 Sqlserver 中的 SP 脚本 因此我需要可用于从 postgresql 检索函数脚本的命令 请帮忙 如果您使用 pl sql 命令行界面 您可以使用 df 正如 tobixen
  • BGAppRefreshTask 后台任务未执行

    我正在使用新的 iOS13 后台任务框架 并实现 BGAppRefreshTask 类型 我的问题是 即使在等待几个小时之后 我的设备也永远不会调用该任务 但我能够使用调用 simulateLaunchForTaskWithIdentifi
  • 在 Tomcat 中为每个服务启用相互 SSL [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我已经成功地在客户端应用程序和 Tomcat 实例之间设置了相互 SSL 不过 我现在正在寻找一种方法 通过相互 SSL 只公开 Tomcat 中部署
  • 为什么实际的 Switch 图像/动画没有显示?

    我在 XML 中声明了一个 Switch 它是使用特定主题的 Activity 的一部分
  • 如何正确安装msvcr71.dll

    我如何在 Windows Server 2003 上安装我的软件需要的 msvcr71 dll 我真的不想将此 dll 复制到 system32 文件夹 因为它可能会破坏此目标系统 只需将其复制到程序的所有可执行文件所在的文件夹中即可 这是
  • sprite-kit 游戏中是否可以有 Twitter / Facebook 分享按钮?

    我完全迷失了 我找到的所有教程都是针对带有故事板的 iOS 6 应用程序 我的问题是你是否可以在精灵套件游戏中拥有 Twitter 或 Facebook 共享功能 如果是这样 添加它的最佳方法是什么 我读过的很多教程都使用视图控制器 但 s
  • 内存不足错误图像视图

    我对 imageview 有问题 我有 77 张图片 jpg 和 126 个引用文本 我想要的只是简单的应用程序 我想显示带有背景图片的所有引用 并且我使用 viewflipper 所以当我向左 向右滑动时进入下一个引用 我给你我现在使用的
  • Qt Designer如何更改背景

    这是转帖 我是 Qt Designer 的新手 想要对一些按钮的丑陋做一些事情 我昨天所做的就是在互联网上查找如何在 Qt Designer 中更改屏幕的背景颜色 如何更改按钮的颜色以及如何使其侧面变成另一种颜色 你猜怎么了 我什么也没找到
  • RubyMine 文件夹树不刷新

    今天首次在 Mac OSX Leopard 上使用 RubyMine 2 0 2 如果我在文件系统中创建文件 例如 使用脚本 生成 这些新文件不会出现在 ruby mine 中 我在重新启动程序时取得了有限的成功 因为 db 文件夹中的文件
  • 如何在 pandas DataFrame 中允许重复的列名

    我有一个数据框 我想更新该数据框的列名称 列名有重复的条目 下面的代码给出错误 无法从重复的轴重新索引 list alpha beta gamma alpha df pd DataFrame datframe columns list No
  • Spotify 最新更新:Autohotkeys 脚本损坏

    我曾经使用 AutoHotKey 脚本作为 Spotify 快捷方式 内置快捷方式有限 只有在应用程序处于焦点状态时才有效 我通常在工作时将其保留在后台 不管怎样 它之前已经更新了一百万次了 没有任何问题 但是我下载了最新的 Spotify
  • AVAssetExportSession 卡住(未启动)导出

    我尝试从照片库导出视频 但导出回调从未执行 我定期检查导出进度 进度始终为零 下面的代码在 99 9 的情况下都有效 但有时在某些设备上 绝对随机 它会停止工作 只有重新启动 iPhone 才有帮助 AVAssetExportSession
  • 为什么这封邮件会直接进入垃圾邮件箱?

    我正在使用以下脚本发送邮件 但这总是最终进入垃圾邮件文件夹 为什么 您在发送邮件时必须使用标头 以证明邮件是来自真实来源而不是机器人 尝试这个
  • 使用 CQRS 在 DDD 中进行命令验证

    我正在学习 DDD 并利用 CQRS 模式 我不明白如何在不从数据存储中读取的情况下验证命令处理程序中的业务规则 例如 克里斯想给阿什利一件礼物 该命令可能是 GiveGiftCommand 我什么时候才能验证克里斯确实拥有他想要赠送的礼物