在应用程序服务中进行验证以检查 DTO 的 id 是否有效或 dto 的属性之一是否为空是否是一种不好的做法?
Is it bad practice to have validation in the application service that checks if a DTO's id is valid or if one of the dto's properties is blank?
我的应用程序服务中有验证逻辑,用于确定请求的操作是否成功,如果不成功,则说明原因。我怀疑这是否是一种代码味道,因为它在应用程序服务中而不是域服务中,它围绕检查域模型是否存在、dto 中的 属性 是否可以为空等展开。代码如下:
我在域模型中进行验证,例如在创建 new Event() 时。构造函数对其传递的值进行基本验证,例如名称不能为 null 或为空。但是当谈到为此编写测试时,我开始质疑验证逻辑是否应该在可以单独测试以进行验证的域服务中。然后可以测试此方法以确保所有依赖项都被正确调用。这让我怀疑这是否是域泄漏到应用程序层,或者这是否被认为是应用程序级逻辑。但与此同时,采用 DTO 并验证值不是域的责任,对吗?
虽然对于Validation放在哪一层有不同的看法,但我个人认为在domain层应该只检查业务规则。将每个验证都放在领域层中会导致领域层走错路。领域层是为业务规则而设计的。检查不为空的 属性 是业务规则吗?如果没有,最好在应用服务层查看。
可以看出Ordering service, which is a Microsoft sample project, this sort of validations is implemented in application layer. In this sample, CreateOrderCommand
is like a DTO. FluentValidation是用在里面的。由于单一职责原则,我建议您使用此工具将验证过程与您的方法分开,并使测试更容易。
我通常会问这个问题 它是 用户 可能做错了什么还是 开发人员 正在实施反对API可能做错了?。我的意思是后者,针对 API 实施的开发人员首先不应允许用户发送一些不完整的请求。
如果您的 API 严格定义必须设置 属性(即强制性)我已经在 API 或应用层 验证了这一点。无需将其传递到域层。因此,如果针对 API 实施的开发人员(例如在 front-end 代码中)忘记确保发送的数据符合规范,则在从 REST 接收和处理数据时应该已经引发错误呼叫,来自队列的消息或使用的任何其他通信协议。我当然是在谈论 与此级别的业务逻辑 无关的不变量。
这当然并不意味着在某些情况下也会在域层中检查类似的内容。领域模型 类 不应允许使用无效数据构建,因此在收到无效属性时引发错误也将是领域层的责任。
检查明显的错误before将其交给领域层也遵守fail fast 原则,并可能避免不必要的操作,例如在调用域模型操作时从数据库加载聚合失败,该操作将失败,因为无论如何请求都没有正确传递参数。
另外请考虑,如果这种情况一旦发生,可能没有太大影响,但考虑到客户端代码中存在一些错误,如果进行大量无效调用,您确实可以节省大量资源。
Is it bad practice to have validation in the application service that checks if a DTO's id is valid or if one of the dto's properties is blank?
所以如果你不检查业务不变量而是检查无效API 规格 我说的是偶 好的做法.
我的应用程序服务中有验证逻辑,用于确定请求的操作是否成功,如果不成功,则说明原因。我怀疑这是否是一种代码味道,因为它在应用程序服务中而不是域服务中,它围绕检查域模型是否存在、dto 中的 属性 是否可以为空等展开。代码如下:
我在域模型中进行验证,例如在创建 new Event() 时。构造函数对其传递的值进行基本验证,例如名称不能为 null 或为空。但是当谈到为此编写测试时,我开始质疑验证逻辑是否应该在可以单独测试以进行验证的域服务中。然后可以测试此方法以确保所有依赖项都被正确调用。这让我怀疑这是否是域泄漏到应用程序层,或者这是否被认为是应用程序级逻辑。但与此同时,采用 DTO 并验证值不是域的责任,对吗?
虽然对于Validation放在哪一层有不同的看法,但我个人认为在domain层应该只检查业务规则。将每个验证都放在领域层中会导致领域层走错路。领域层是为业务规则而设计的。检查不为空的 属性 是业务规则吗?如果没有,最好在应用服务层查看。
可以看出Ordering service, which is a Microsoft sample project, this sort of validations is implemented in application layer. In this sample, CreateOrderCommand
is like a DTO. FluentValidation是用在里面的。由于单一职责原则,我建议您使用此工具将验证过程与您的方法分开,并使测试更容易。
我通常会问这个问题 它是 用户 可能做错了什么还是 开发人员 正在实施反对API可能做错了?。我的意思是后者,针对 API 实施的开发人员首先不应允许用户发送一些不完整的请求。
如果您的 API 严格定义必须设置 属性(即强制性)我已经在 API 或应用层 验证了这一点。无需将其传递到域层。因此,如果针对 API 实施的开发人员(例如在 front-end 代码中)忘记确保发送的数据符合规范,则在从 REST 接收和处理数据时应该已经引发错误呼叫,来自队列的消息或使用的任何其他通信协议。我当然是在谈论 与此级别的业务逻辑 无关的不变量。
这当然并不意味着在某些情况下也会在域层中检查类似的内容。领域模型 类 不应允许使用无效数据构建,因此在收到无效属性时引发错误也将是领域层的责任。
检查明显的错误before将其交给领域层也遵守fail fast 原则,并可能避免不必要的操作,例如在调用域模型操作时从数据库加载聚合失败,该操作将失败,因为无论如何请求都没有正确传递参数。
另外请考虑,如果这种情况一旦发生,可能没有太大影响,但考虑到客户端代码中存在一些错误,如果进行大量无效调用,您确实可以节省大量资源。
Is it bad practice to have validation in the application service that checks if a DTO's id is valid or if one of the dto's properties is blank?
所以如果你不检查业务不变量而是检查无效API 规格 我说的是偶 好的做法.