如果有 CQRS、DTO 和实体,如何验证输入数据?

How to validate input data if there are CQRS, DTO and Entity?

.Net Core 3,干净的架构。

我阅读了很多关于使用 CQRS 进行数据验证的文章。例如 there and there.

我做了一些总结:

  1. 需要验证 DTO 中的数据。它是实体的合同。
  2. 作者的一些建议将日期验证为实体(域)。
  3. 在 CQRS AbstractValidator 中我们也可以验证,但其他规则。

电子邮件字段验证将在 1 和 2 中进行。 年龄限制将在 3.

但是服务器中的三个验证+客户端中的一个验证是有问题的(大DRY)。 DTO 或实体中哪里有更好的验证?我认为在 DTO 中,因为当我从输入中获取 DTO 时,我可以验证并调用 ModelState.IsValid。但我也阅读了一些需要在实体中验证输入数据的文章。

所以,我很困惑。你能解释一下吗:

如果需要验证电子邮件字段和年龄限制 (18),需要在使用 CQRS 的 Clean Architecture 中将验证放在哪里?

你所有的 Api 合同、命令都应该依赖原始类型。一旦你想初始化你的域模型,如果有错误的话,这里是你将无法做到的地方。如果您执行 DDD,它建议防止对象处于无效状态与验证无效对象(域模型与基于 Crud)。

这完全取决于验证的类型。是肤浅的还是深度的验证?

表面验证是指密码强度或检查 URL 或电子邮件地址的正确格式。而深度验证是对领域很重要的事情。所以这可能是这样的,这个货物是否危险,或者这个人的风险太大而无法提供信贷。

查看此 post,它从 CQRS 的角度更详细地解释了该概念:How to validate Commands in a CQRS Application

Clean Architecture 按层划分职责,每一层都应该有自己的验证逻辑。

每一层都应该拒绝违反其层职责的输入。这是验证。因此验证的含义根据其上下文而有所不同。