c# - ServiceStack - 验证和数据库访问

标签 c# validation servicestack fluentvalidation

我正在使用 ServiceStack 实现一个 API。我的解决方案的关键方面之一是积极的验证策略。

我使用 ServiceStack 的 ValidationFeature,这意味着如果在应用程序容器中注册了 IValidator< ReqDto >(或其后代:AbstractValidator< ReqDto >),验证将在服务之前自动运行。

通过积极验证,我的意思是我检查所有可能的错误场景,并在验证器级别进行逻辑验证。因此,我的服务逻辑非常简洁。

从实用的角度来看,服务逻辑与服务验证的这种独立性非常好,因为它提供了非常容易阅读和推理的服务逻辑/实现。但是,我开始认为 FluentValidation 的规则和规则集更适合简单的格式验证,而不是像我正在做的那样直接访问数据库(主要是为了测试从请求中提取的 id 引起的 404 错误)。

问题:

1:访问数据库的验证逻辑在概念上是否不正确?

2:据我目前所见,包括 SS 源代码,我没有找到一种形式来为以下情况定义 FluentValidation 规则:从请求中提取一个 Id,访问数据库检索一个实体,然后抛出一个404 如果找不到条目。我只使用 FV 的规则来定义基本的格式验证,例如:

RuleFor(x => x.UserName).NotEmpty();
RuleFor(x => x.Password).NotEmpty();

其余的我手动完成。任何人都可以解决这个问题?

注意:这不是关于如何将 ValidationResult/ValidationError 转换为 HttpResult/HttpError 的问题。我已经通过使用 SS 3.9.44 中引入的 ValidationFeature 的 ErrorResponseFilter 进行了介绍。 谢谢

最佳答案

是的,在验证逻辑中检查数据库记录是否存在是不正确的,因为这不是验证检查。这就是示例中未以这种方式完成的原因。

检查记录是否存在是一种验证检查。举个例子来说明这一点:

如果你拿信用卡号,你可以使用Luhn Algorithm验证信用卡号是否有效。这将在验证器中完成,因为它是验证。

但仅仅因为您拥有一个有效号码并不意味着它存在,您可能拥有一张尚未发行的卡的有效号码。使用验证器来验证它是否存在是不正确的,因为这是一个验证过程,应该在业务逻辑中完成。

当您开始使用数据库检查内容是否存在时,您就超出了验证范围,因为您应该只将经过验证的数据传递给数据库。

您可以阅读有关 difference between validation and verification here 的更多信息.

关于c# - ServiceStack - 验证和数据库访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21801819/

相关文章:

c# - 以编程方式在联机和脱机之间移动 OneDrive 文件

c# - ServiceStack "new"api 和异步等待

c# - 将动态 Dapper 结果序列化为 CSV

c# - 如何按参数化类型过滤而不考虑其参数类型?

c# - 来自数组中对象元素的数组

jquery - 联系表单验证问题

javascript - 为什么这个handleBlur函数带有事件参数,而函数内部没有使用事件参数呢?

c# - ServiceStack 服务可以包含多个方法吗?

c# - 构造函数限制

javascript - 到达数组末尾后如何执行函数?