Example #1
0
 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);
 }
Example #2
0
        /// <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);
        }
Example #3
0
        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);
        }
Example #4
0
 public IValidationChainMemberBuilder <T> StopOnFailure()
 {
     _member = _ruleSet.SetStopOnFailure(_member);
     return(this);
 }
Example #5
0
 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));
 }
Example #11
0
 private void AddMember(IValidationChainMember <T> member)
 {
     _validationChain.Add(member);
 }