Domain driven design 我应该在DDD体系结构中向DTO添加验证吗?

Domain driven design 我应该在DDD体系结构中向DTO添加验证吗?,domain-driven-design,Domain Driven Design,我通常使用dto将请求从Presentation发送到Application,并使用dto将响应从Application发送回Presentation 我通常使用属性来装饰请求的属性,例如Required,StringLength,等等。但没有商业规则 但是,我从多个来源中了解到,我根本不应该在dto中添加任何类型的验证(例如Required、StringLength等属性) 我想问一下,根据DDD文献,推荐的方法是什么。谢谢。DDD中负责输入验证的概念是应用程序服务。 因此,您应该删除属性并验

我通常使用
dto
将请求从
Presentation
发送到
Application
,并使用
dto
将响应从
Application
发送回
Presentation

我通常使用属性来装饰请求的属性,例如
Required
StringLength
,等等。但没有商业规则

但是,我从多个来源中了解到,我根本不应该在
dto
中添加任何类型的验证(例如
Required
StringLength
等属性)


我想问一下,根据DDD文献,推荐的方法是什么。谢谢。

DDD中负责输入验证的概念是应用程序服务。

因此,您应该删除属性并验证应用程序服务中的DTO仅使用DTO定义结构,并在应用程序服务中执行输入验证。


如果您在不同的应用程序服务中获得大量重复代码(例如,因为它们使用相同的DTO并需要相同的验证),您当然可以将验证提取到可重用的服务中。不过,应用程序服务控制输入验证。

您通常是从应用程序服务返回友好的错误消息,还是直接抛出错误消息?我通常使用值对象作为验证约束,这使得它在域中具有表现力,但要得到一个好的错误报告却很麻烦。例如,
emailAddress=新的emailAddress(dto.emailAddress);帐户。更改电子邮件(电子邮件地址)。因此,我将确保客户端发送有效命令作为客户端的工作。@plalx通常我会抛出一个包含描述性消息的异常,但该消息仅用于开发人员/调试目的。首先不应触发异常,因为客户端验证确保只向服务器发送有效请求。当然,任何人都可以篡改请求。我还可以在应用程序服务中从未验证状态的原始数据创建VO,但根据规范立即验证它们,以验证基本业务规则。