ServiceStack - 验证和数据库访问

Cri*_*vão 3 c# validation fluentvalidation servicestack

我正在使用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();
Run Code Online (Sandbox Code Playgroud)

其余的我手动做.有解决这个问题的人吗?

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

Sco*_*ott 7

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

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

如果您使用信用卡号,您可以使用Luhn算法验证信用卡号是否有效.这将在验证器中完成,因为它是验证.

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

当您开始使用数据库来检查是否存在您不在验证领域的东西,因为您应该只将验证数据传递给数据库.

您可以在此处详细了解验证和验证之间区别.