ServiceStack - 验证和数据库访问

时间:2014-02-15 18:32:37

标签: 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,我已经介绍过了。 感谢

1 个答案:

答案 0 :(得分:7)

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

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

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

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

当您开始使用数据库检查是否存在您不在验证范围内的东西时,因为您应该只将验证数据传递给数据库。

您可以详细了解difference between validation and verification here