private static bool CheckDependsOnMembers <T>( IList <IValidationChainMember <T> > chain, T instance, IValidationChainMember <T> validationChainMember, Dictionary <RuleIdentity, ValidationResult> validationMap, ValidationResult result, ValidationContext context) { foreach (var dependsOnMember in validationChainMember.DependOnRules) { if (!validationMap.TryGetValue(dependsOnMember.RuleIdentity, out var savedResult)) { var onMember = dependsOnMember; var member = chain.FirstOrDefault(x => x.Identity == onMember.RuleIdentity); if (member == null) { throw new ValidationException($"Не зарегистрировано правила с кодом {onMember.RuleIdentity.Code}"); } if (!CheckDependsOnMembers(chain, instance, member, validationMap, result, context)) { return(false); } var processResult = ProcessRule(instance, member, validationMap, result, context); if (!dependsOnMember.SatisfyCondition(processResult)) { return(false); } } else { if (!dependsOnMember.SatisfyCondition(savedResult)) { return(false); } } } return(true); }
/// <summary> /// Задает для участника цепи логику, позволяющую останавливать выполнение цепи /// </summary> /// <param name="member">Участник сообщений</param> /// <returns>Участник цепи</returns> internal IValidationChainMember <T> SetStopOnFailure(IValidationChainMember <T> member) { var decorator = new StopOnFailureChainMemberDecorator <T>(member); _validationChain.Remove(member); AddMember(decorator); return(decorator); }
private static ValidationResult ProcessRule <T>( T instance, IValidationChainMember <T> validationChainMember, Dictionary <RuleIdentity, ValidationResult> validationMap, ValidationResult result, ValidationContext context) { if (validationMap.TryGetValue(validationChainMember.Identity, out var validationResult)) { return(validationResult); } var res = validationChainMember.Process(instance, context); validationMap[validationChainMember.Identity] = res; result.MergeResult(res); return(res); }
public IValidationChainMemberBuilder <T> StopOnFailure() { _member = _ruleSet.SetStopOnFailure(_member); return(this); }
public ValidationChainMemberBuilder(BaseValidationRuleSet <T> ruleSet, IValidationChainMember <T> member) { _ruleSet = ruleSet ?? throw new ArgumentNullException(nameof(ruleSet)); _member = member ?? throw new ArgumentNullException(nameof(member)); }
public void DependsOn(IValidationChainMember <T> member, Func <ValidationResult, bool> condition) { _member.DependsOn(member, condition); }
public void DependsOn(IValidationChainMember <T> member) { _member.DependsOn(member); }
public StopOnFailureChainMemberDecorator(IValidationChainMember <T> member) { _member = member ?? throw new ArgumentNullException(nameof(member)); }
public void DependsOn(IValidationChainMember <T> member, Func <ValidationResult, bool> condition) { _dependOnRules.Add(new DependsOnMember(condition, member.Identity)); }
public void DependsOn(IValidationChainMember <T> member) { _dependOnRules.Add(new DependsOnMember(r => r.IsValid, member.Identity)); }
private void AddMember(IValidationChainMember <T> member) { _validationChain.Add(member); }