C# 您会对数据库调用使用fluent验证吗

C# 您会对数据库调用使用fluent验证吗,c#,database,fluentvalidation,C#,Database,Fluentvalidation,通过流畅的验证,您可以在更新密码之前验证简单的内容,如NotNull、NUMBERGREATER、userMustExistsOnDb或更高级的业务规则 我感觉当我使用fluent验证时,我的DB调用次数是不使用它时的两倍。这里有一个例子 public class DeleteCustomerRequestValidator: AbstractValidator<DeleteCustomerRequest> { public DeleteCUstomerRequestValida

通过流畅的验证,您可以在更新密码之前验证简单的内容,如NotNull、NUMBERGREATER、userMustExistsOnDb或更高级的业务规则

我感觉当我使用fluent验证时,我的DB调用次数是不使用它时的两倍。这里有一个例子

public class DeleteCustomerRequestValidator: AbstractValidator<DeleteCustomerRequest> {
  public DeleteCUstomerRequestValidator() {
    RuleFor(customer => customer.Id).GreaterThan(0);
    RuleFor(customer => customer.Id).Must(ExistsOnDB).WithMessage("The customer does not exists");
  }

  private bool ExistsOnDB(int customerId) {
    // DB call to check if exists on Db
    return Respository.Customers.Any(x => x.Id == customerId)    // CALL NUMBER 1
  }
}
然而,如果我不使用Fluent验证,我将只进行一次呼叫,以从DB获得客户

public void DeleteCustomer(int customerId)
{
     if (customerId < 1)
     {
         /// Return error.
     }
     Customer customer = Repository.Customers.FirstOrDefault(x => x.Id);  // Only 1 CALL
     if (customer == null)
     {
         // Return error.
     }
     Repository.Customers.Delete(customer) 
     Repository.Save()
}
public void DeleteCustomer(int customerId)
{
如果(客户ID<1)
{
///返回错误。
}
Customer=Repository.Customers.FirstOrDefault(x=>x.Id);//仅1次调用
如果(客户==null)
{
//返回错误。
}
Repository.Customers.Delete(客户)
Repository.Save()
}
我做错了什么?有更好的方法吗


谢谢您的时间。

一般来说,我会说不,不要使用流利的验证

  • 我认为您正在添加额外的复杂性/不必要的抽象验证器类,在这些类中,一个简单的if就足够了

  • 对于类似“删除”的内容,是的,您将首先检查客户是否存在。但是大多数逻辑应该在Customer类本身中。因此,您不应该需要这个外部验证器类


  • 如果希望有一个IsValid和一个进程中发生的错误列表,则需要FluidValidation。在这种情况下,您将添加一个验证,确认整个删除成功,如果没有成功,验证将记录为什么没有成功。但不是每行代码的验证

    打开SQL Server profiler,看看有哪些调用碰到了DBA,尽管我可以理解这个简单验证案例的答案。在某些情况下,存在许多验证,然后您可能会将验证逻辑划分到多个位置。我认为更好的方法是将db查询的结果作为。一个更好的方法是缓存结果,然后您就不需要关心多个调用,只要它们在缓存到期时间的边界内
    public void DeleteCustomer(int customerId)
    {
         if (customerId < 1)
         {
             /// Return error.
         }
         Customer customer = Repository.Customers.FirstOrDefault(x => x.Id);  // Only 1 CALL
         if (customer == null)
         {
             // Return error.
         }
         Repository.Customers.Delete(customer) 
         Repository.Save()
    }