如何“查询”聚合以查看命令是否可以执行

Con*_*enu 1 events domain-driven-design aggregateroot cqrs event-sourcing

我有一个电子邮件草稿与以下命令的聚合根:addToRecipientaddCcRecipientaddBccRecipientupdateBodyTextuploadAttachmentremoveAttachment并在UI我想禁用SEND按钮,如果还没有准备好要发送的草案(即至少有上收件人和正文中有文字)。我知道我不允许查询聚合,但这是唯一可以告诉我可以发送或不能发送电子邮件的消息。

如果我要应用我对事件源和CQRS的了解,则聚合将发出一个EmailIsReadyToBeSent事件,而我的UserEmailDrafts读取模型将选择该事件并以某种方式更新UI,但是,我将必须在每个命令之后检查并发送取消事件,即EmailIsNotReadyToBeSent

这感觉很复杂,您怎么看?

gui*_*e31 5

除非有收件人和正文,否则无法发送电子邮件这一事实与应用逻辑接壤,因为在一天结束时,与其说是复杂的域不变式,不如说是表单中填写字段的问题。

我将不必每次屏幕上发生任何更改时都依赖于整个跨层往返查询读取模型,而是将一些基本规则的知识注入UI中,以便在指定收件人和正文时立即重新启用该按钮。 。

实际上,当您看到客户端逻辑实际上在表单上执行必需的字段验证时,您不会感到震惊。由于逻辑简单且通用,因此这是一个完全有效且可以接受的折衷方案。

请注意,这也不会阻止您将这些规则也汇总在一起,拒绝任何不满足这些规则的命令。