2014-11-05 80 views
1

有一个类和我的验证是这样的:流利的验证,必须自定义验证

public ValidationResult Validate(CustomerType customerType) 
    { 
     CustomerType Validator validator = new CustomerTypeValidator(); 
     validator.RuleFor(x => x.Number).Must(BeUniqueNumber); 

     return validator.Validate(customerType); 
    } 

    public bool BeUniqueNumber(int number) 
    { 
     //var result = repository.Get(x => x.Number == customerType.Number) 
     //      .Where(x => x.Id != customerType.Id) 
     //      .FirstOrDefault(); 

     //return result == null; 
     return true; 
    } 

的CustomerTypeValidator是一个基本的验证类验证字符串属性。

我还添加了一个新规则来检查数据库中的数字是否是唯一的。我在这个课上做,因为有一个参考资料库。验证器类没有这样的参考。

这里的问题是BeUniqueNumber方法应该有一个CustomerType参数。但是,当我这样做时,我在上面的RuleFor行上出现错误,因为'Must'需要一个int作为参数。

有没有办法解决这个问题?

回答

1

你可以试试吗?

public ValidationResult Validate(CustomerType customerType) 
{ 
    CustomerTypeValidator validator = new CustomerTypeValidator(); 
    validator.RuleFor(x => x).Must(HaveUniqueNumber); 

    return validator.Validate(customerType); 
} 

public bool HaveUniqueNumber(CustomerType customerType) 
{ 
    var result = repository.Get(x => x.Number == customerType.Number) 
     .Where(x => x.Id != customerType.Id) 
     .FirstOrDefault(); 

    return result == null; 
    //return true; 
} 

你也应该能够做到这一点:

public ValidationResult Validate(CustomerType customerType) 
{ 
    CustomerTypeValidator validator = new CustomerTypeValidator(); 
    validator.RuleFor(x => x.Number).Must(BeUniqueNumber); 

    return validator.Validate(customerType); 
} 

public bool BeUniqueNumber(CustomerType customerType, int number) 
{ 
    var result = repository.Get(x => x.Number == number) 
     .Where(x => x.Id != customerType.Id) 
     .FirstOrDefault(); 

    return result == null; 
    //return true; 
} 

“我还添加了一个新的规则,以检查该号码是否在DB唯一我在课堂上做 它。因为有一个参考资料库。“

那么,为什么你不能让你的验证器引用存储库呢?

CustomerTypeValidator validator = new CustomerTypeValidator(repository); 
+0

我也试过。它不工作,因为'必须'需要 2014-11-05 13:14:51

+0

@ Ivan-MarkDebono这很奇怪,你确定吗?我只是尝试了一些非常相似的东西,Predicate方法只需要一个'T',而不是'TProperty'。你确定你在做'x =>'x,而不是'x => x.Number'吗?我还用另一种替代方法更新了我的答案。 – danludwig 2014-11-05 13:18:52

+0

我已经尝试了两种方式,他们不会工作。如果没有这样做的话,我宁愿不传递存储库。 – 2014-11-05 13:23:55