首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >拦截Fluent验证

拦截Fluent验证
EN

Stack Overflow用户
提问于 2020-04-30 16:42:19
回答 1查看 610关注 0票数 3

我们正在使用流利验证(与服务堆栈)来验证我们的请求DTO。我们最近扩展了我们的框架以接受“修补程序”请求,这意味着我们现在只有在包含被验证字段的修补程序时才需要应用验证。

我们使用这样的扩展方法完成了这一工作:

代码语言:javascript
复制
       RuleFor(dto => dto.FirstName).Length(1,30)).WhenFieldInPatch((MyRequest dto)=>dto.FirstName);
       RuleFor(dto => dto.MiddleName).Length(1,30)).WhenFieldInPatch((MyRequest dto)=>dto.MiddleName);
       RuleFor(dto => dto.LastName).Length(1,30)).WhenFieldInPatch((MyRequest dto)=>dto.LastName);

这意味着我们可以对POST/PUT或修补程序运行相同的验证。

我一直在寻找一种连接到fluent验证框架的方法,例如我们不需要在我们验证的每一行上复制.WhenFieldInPatch()规则,但是还没有找到一种很好的方法来做到这一点。

我尝试了以下几点:

  1. 创建一个助手方法(在基类中)来拦截初始的"RuleFor“,它预先添加了.When()子句,但是这个方法不能工作,因为流畅的验证要求.When()是最后一个
  2. 拦截PreValidation中的调用,但我只能根据整个类进行拦截,而不是根据规则进行拦截。
  3. 添加一个扩展方法以应用于每条规则的末尾(例如),但我无法访问初始表达式以检查是否应该映射该字段,因此我需要再次传递它。

我是错过了什么,还是在尝试不可能的事?

谢谢

EN

回答 1

Stack Overflow用户

发布于 2020-04-30 17:00:34

当我需要分享流利的验证逻辑时,我会使用扩展方法,下面是TechStacks的共享扩展方法的一个例子,例如:

代码语言:javascript
复制
public static class ValidatorUtils
{
    public static bool IsValidUrl(string arg) => Uri.TryCreate(arg, UriKind.Absolute, out _);
    public static string InvalidUrlMessage = "Invalid URL";

    public static IRuleBuilderOptions<T, string> OptionalUrl<T>(
        this IRuleBuilderInitial<T, string> propertyRule)
    {
        return propertyRule
            .Length(0, UrlMaxLength)
            .Must(IsValidUrl)
            .When(x => !string.IsNullOrEmpty(x as string))
            .WithMessage(InvalidUrlMessage);
    }
}

以及共享它们的一些例子

代码语言:javascript
复制
public class CreatePostValidator : AbstractValidator<CreatePost>
{
    public CreatePostValidator()
    {
        RuleSet(ApplyTo.Post, () =>
        {
            RuleFor(x => x.Url).OptionalUrl();
        });
    }
}

public class UpdatePostValidator : AbstractValidator<UpdatePost>
{
    public UpdatePostValidator()
    {
        RuleSet(ApplyTo.Put, () =>
        {
            RuleFor(x => x.Url).OptionalUrl();
        });
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61528512

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档