您会在数据库调用中使用流畅的验证吗
Would you use fluent validation with database calls
通过流畅的验证,您可以在更新密码之前验证简单的事情,例如 NotNull 、 numberGreaterThan 或更高级的业务规则,例如 userMustExistsOnDb。
我感觉 当我使用流式验证时,我进行的数据库调用次数是我不使用时的两倍。这是一个例子。
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()
}
我做错了什么?有更好的方法吗?
感谢您的宝贵时间。
一般来说,我会说不,不要使用 Fluent Validation。
我认为您正在添加额外的复杂性/不必要的 AbstractValidator classes,其中一个简单的 if 就足够了。
对于 "Delete" 之类的东西,是的,您将首先检查客户是否存在。但大多数逻辑应该在客户 class 本身。因此,你不应该需要这个外部验证器 class.
如果您想拥有一个 IsValid 和一个过程中发生的错误列表,则需要 FluidValidation。在这种情况下,您将添加一个验证以证明整个删除操作成功,如果不成功,验证将记录不成功的原因。但不是对每一行代码的验证。
通过流畅的验证,您可以在更新密码之前验证简单的事情,例如 NotNull 、 numberGreaterThan 或更高级的业务规则,例如 userMustExistsOnDb。
我感觉 当我使用流式验证时,我进行的数据库调用次数是我不使用时的两倍。这是一个例子。
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()
}
我做错了什么?有更好的方法吗?
感谢您的宝贵时间。
一般来说,我会说不,不要使用 Fluent Validation。
我认为您正在添加额外的复杂性/不必要的 AbstractValidator classes,其中一个简单的 if 就足够了。
对于 "Delete" 之类的东西,是的,您将首先检查客户是否存在。但大多数逻辑应该在客户 class 本身。因此,你不应该需要这个外部验证器 class.
如果您想拥有一个 IsValid 和一个过程中发生的错误列表,则需要 FluidValidation。在这种情况下,您将添加一个验证以证明整个删除操作成功,如果不成功,验证将记录不成功的原因。但不是对每一行代码的验证。