c# - 空对象的 FluentValidation 规则

标签 c# fluentvalidation

我一直在尝试找出如何创建一个 FluentValidation 规则,该规则在验证它的属性之前检查它正在验证的对象的实例是否不为 null。

我宁愿将此空验证封装在验证器中,而不是在调用代码中进行。

请参阅下面的示例代码,并在需要所需逻辑的地方添加注释:

namespace MyNamespace
{
    using FluentValidation;

    public class Customer
    {
        public string Surname { get; set; }
    }

    public class CustomerValidator: AbstractValidator<Customer> 
    {
        public CustomerValidator() 
        {
            // Rule to check the customer instance is not null.

            // Don't continue validating.

            RuleFor(c => c.Surname).NotEmpty();
        }
    }

    public class MyClass
    {
        public void DoCustomerWork(int id)
        {
            var customer = GetCustomer(id);
            var validator = new CustomerValidator();

            var results = validator.Validate(customer);

            var validationSucceeded = results.IsValid;
        }

        public Customer GetCustomer(int id)
        {
            return null;
        }
    }
}

所以我的问题是如何在 CustomerValidator() 构造函数中检查当前客户实例是否为空,并如果为空则中止进一步的规则处理

提前致谢。

最佳答案

编辑 2022-07-19
正如一些评论者指出的那样,请查看答案 https://stackoverflow.com/a/52784357/1943对于更新的实现。我没有亲自审查过,但值得先尝试一下。

如果您使用的是旧版本,或者您喜欢怀旧,我下面的原始答案来自 2013 年。


您应该能够覆盖 CustomerValidator 类中的 Validate 方法。

public class CustomerValidator: AbstractValidator<Customer> 
{
    // constructor...
    
    public override ValidationResult Validate(Customer instance)
    {
        return instance == null 
            ? new ValidationResult(new [] { new ValidationFailure("Customer", "Customer cannot be null") }) 
            : base.Validate(instance);
    }
}

关于c# - 空对象的 FluentValidation 规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17095791/

相关文章:

c# - 这个奇怪的 C# 语法是什么?我该如何构建它?

c# - 当锁没有竞争时, lock(...) 的开销是多少?

c# - 在PowerShell中使用C#源代码进行转换

c# - 如何将由垂直线分隔的段落文本添加到 itextsharp 创建的 PDF 中

C#构造函数参数传递

datetime - FluentValidation - 仅当 NOT NULL 时检查值是否为日期

c# - 如何通过验证和可选的请求上下文直接从 C# 代码调用 servicestack 服务

c# - 相互依赖的链接规则

c# - 如何使用 Fluent Validator 在 RuleForEach 验证消息中返回特定属性?

c# - FluentValidation 是否有开箱即用的错误级别?