2014-11-05 54 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