【问题标题】:What kind of validations to do with FluentValidations?使用 FluentValidation 进行什么样的验证?
【发布时间】:2018-05-03 12:05:03
【问题描述】:

在使用数据库的面向数据的应用程序的上下文中:

我使用 FluentValidations 只是为了验证 Id 是否为正数,或者参数不是 null未命中数据库的内容

但过了一段时间,我想知道为什么不验证实际查询数据库的东西。所以我决定进一步验证,现在我的Validator 不仅验证指定的 Id 是一个正数,而且还验证了实体存在

这是验证者的目标吗?我在滥用它吗? Validator 是否也应该检查复杂的业务规则?

【问题讨论】:

    标签: c# .net validation fluentvalidation


    【解决方案1】:

    恕我直言,使用FluentValidator 来检查业务规则完全没问题。但最好将业务规则与简单验证分开。例如,如果它的 ASP.NET 应用程序一般验证应该在表示层中执行(例如使用 ModelState),但业务规则应该在域层中发挥作用(例如,在某些服务或 decorator)中。

    您会发现这些链接很有用:

    1. ValidateModelAttribute
    2. Validate command using Decorator pattern
    3. Simple Injector(fast DI container, great for decorators)

    【讨论】:

    • 谢谢!一般的经验法则是什么?我正在做一个 Web API,验证器针对每个请求采取行动。也许,这方面的 Validator 可以拦截常见的东西,比如找不到 Id 的 GetById。但是,根据业务规则验证请求应满足的复杂条件是否有意义?还是应该在较低层执行验证,并在不满足条件时抛出适当的异常?
    • 这取决于您的要求。我想在你的控制器中执行基本验证是有意义的(你可以尝试将 FluentValidation 集成到内置管道中,只需使用 ModelState 或自行获取验证器并手动调用 Validate )并在失败的情况下返回 400。但对于更复杂的域和数据库相关验证,您最好在某个较低层验证您的实体(我希望您有一些服务、存储库或命令处理程序)。它也可以手动完成或使用装饰器/拦截器。要指示失败,您可以抛出异常或返回验证结果
    【解决方案2】:

    有两种方法可以进行这种验证:
    1.创建一个类,继承自ProperyValidator,用于实体验证类。

    public class UniqueValidator<T> : PropertyValidator where T:class
    {
     //inject the repository
     protected override bool isValid(PropertyValidatorContext context){
      //check the validity
     }
    }
    

    2.直接创建EntityValidation类的方法

    public class EntityValidation : AbstractValdiation<Entity>{
     //inject the repository
    
    
     //your current validations
    
     public bool UniqueValue(Entity instance){
       //query to validate
     }
    }
    

    【讨论】:

    • 抱歉,我想问的是检查验证器内部的复杂业务逻辑是否是个坏主意。
    猜你喜欢
    • 1970-01-01
    • 2022-11-09
    • 2021-07-13
    • 1970-01-01
    • 1970-01-01
    • 2015-12-04
    • 1970-01-01
    • 2011-12-03
    • 1970-01-01
    相关资源
    最近更新 更多