Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ServiceStack-验证和数据库访问_C#_Validation_<img Src="//i.stack.imgur.com/WM7S8.png" Height="16" Width="18" Alt="" Class="sponsor Tag Img">servicestack_Fluentvalidation - Fatal编程技术网 servicestack,fluentvalidation,C#,Validation,servicestack,Fluentvalidation" /> servicestack,fluentvalidation,C#,Validation,servicestack,Fluentvalidation" />

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

C# ServiceStack-验证和数据库访问,c#,validation,servicestack,fluentvalidation,C#,Validation,servicestack,Fluentvalidation,我正在用ServiceStack实现一个Api。我的解决方案的一个关键方面是积极的验证策略 我使用ServiceStack的ValidationFeature,这意味着如果在应用程序容器中注册了一个IValidator(或其后代:AbstractValidator),验证将在服务之前自动运行 通过积极的验证,我的意思是检查所有可能的错误场景,以及验证程序级别的逻辑验证。因此,我的服务逻辑非常简洁 从实用的角度来看,服务逻辑与服务验证的这种独立性是非常好的,因为它提供了关于服务逻辑/实现的非常易于

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

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

通过积极的验证,我的意思是检查所有可能的错误场景,以及验证程序级别的逻辑验证。因此,我的服务逻辑非常简洁

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

问题:

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

2:从我目前看到的情况来看,包括SS source,我没有找到一个表单来定义FluentValidation规则,例如:从请求中提取Id,访问数据库检索实体,如果找不到条目则抛出404。我仅使用FV的规则定义基本格式验证,例如:

RuleFor(x => x.UserName).NotEmpty();
RuleFor(x => x.Password).NotEmpty();
剩下的我是手工做的。有人能解决这个问题吗

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

是的,在验证逻辑中执行数据库记录存在性检查是不正确的,因为这不是验证检查。这就是为什么在示例中没有这样做的原因

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

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

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

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


您可以阅读更多关于。

从服务边界移除验证的任何方法,与验证相同?@Blitzkrieg您希望实现在服务之前运行的请求筛选器。这将使其与验证具有类似的性质。需要注意的关键是,记录不存在应该引发NotFound异常,而不是验证异常。看这里。是的,这是很明显的。。。它确实从验证中抛出401403404409421和500。如果你在问题中看到,我在这里添加了一个注释。在SO上发布/回复的每个人的最终目标都是为生产更好的软件做出贡献。我只是指出,从我的问题中可以明显看出,我理解“不存在应该抛出NotFound异常,而不是validation异常”。就这样,没必要为此烦恼。谢谢你的帮助,这不是你第一次给我提供有用的见解。