你会使用流畅的验证与数据库调用

时间:2015-01-09 16:38:16

标签: c# database fluentvalidation

通过流畅的验证,您可以在更新密码之前验证诸如NotNull,numberGreaterThan之类的简单事物或更高级的业务规则,例如userMustExistsOnDb。

我感觉当我使用流畅的验证时,我做的数量是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
  }
}

这是我进行第二次调用的删除方法

public void DeleteCustomer(int customerId)
{
     Customer customer = Repository.Customers.First(x => x.Id);  // CALL NUMBER 2
     Repository.Customers.Delete(customer) 
     Repository.Save()
}

但是如果我不使用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()
}

我做错了什么?有没有更好的方法呢?

感谢您的时间。

2 个答案:

答案 0 :(得分:0)

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

  1. 我认为你正在添加额外的复杂性/不必要的AbstractValidator类,其中一个简单的if就足够了。

  2. 对于类似“删除”的内容,是的,您将检查客户是否先存在。但MOST逻辑应该属于Customer类本身。因此,您不应该需要此外部验证器类。

答案 1 :(得分:0)

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