我正在学习 DDD 并利用 CQRS 模式。我不明白如何在不从数据存储中读取的情况下验证命令处理程序中的业务规则。
例如,克里斯想给阿什利一件礼物。
该命令可能是 GiveGiftCommand。
我什么时候才能验证克里斯确实拥有他想要赠送的礼物?如果不从数据库读取数据,我该如何做到这一点?
关于命令处理程序中的验证存在不同的观点和意见。
Command 可以被拒绝, 我们可以说No如果该命令无效。
通常,您会在 UI 上进行验证,并且可能会在命令处理程序中重复(有些人也倾向于将其放在域中)。然后,命令处理程序可以运行可以在实体外部发生的简单验证,例如数据格式是否正确、是否存在预期值等。
另一方面,业务逻辑不应该在命令处理程序中。它应该在您的域中。
所以我认为根本的问题是......
我应该从命令处理程序查询读取端吗?
我会说不。不要在命令处理程序或域逻辑中使用读取模型。但是你可以随时从客户端查询您的读取模型获取命令所需的数据并验证命令。您可以查询客户端的读取端,以检查克里斯是否确实拥有他想要赠送的礼物。当然,涉及读取模型的验证可能最终是一致的,这当然是命令处理程序内的聚合被拒绝的另一个原因。
有些人不同意这样的说法:如果您要求命令包含处理程序验证命令所需的数据,那么您永远无法在不影响客户端的情况下更改处理程序/域中的验证逻辑。这向客户暴露了太多的领域知识,并且违背了客户只想表达意图的事实。所以他们倾向于提供一个GiftService
接口(这是通用语言的一部分)到您的命令处理程序,然后根据需要实现该接口 - 这可能包括查询读取端。
我认为客户端应该始终假设它发出的命令会成功。不需要调用读取端来验证命令。获得两个相互矛盾的命令的可能性很小(用户使用相同的电子邮件地址创建帐户)。然后您应该有一种方法来发出纠正措施,例如 Saga/Process Manager。因此,如果命令可以被验证并且首先不被发送,那么采取纠正措施就会减少问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)