Пример #1
0
        private static IValidatableSchema Validate(IValidatableSchema validatable)
        {
            var properties = validatable.GetType().GetProperties();

            if (!properties.Any() || (validatable.GetSchemaRules() is null) || !validatable.ChangedHashCode())
            {
                return(validatable);
            }

            var rules = validatable.GetSchemaRules();
            var describedValidations = rules.GetType().GetProperties();

            var validationResult = new ValidationResult();


            var tasks = new List <Task>();

            foreach (var validation in describedValidations)
            {
                tasks.AddRange(ValidationFactory.CreateByPropertyName(validatable,
                                                                      properties,
                                                                      validation.Name,
                                                                      validation.GetValue(rules)?.ToString().Split('|'),
                                                                      validationResult));
            }

            tasks.ForEach(t => t.Start());

            Task.WaitAll(tasks.ToArray(), TASK_EXECUTION_TIMEOUT);

            validatable.ValidationResult = validationResult;
            validatable.SetHashCode();

            return(validatable);
        }
Пример #2
0
 public static IValidatableSchema ValidateSchema(this IValidatableSchema validatable)
 {
     lock (_lock)
     {
         return(Validate(validatable));
     }
 }
Пример #3
0
        public static List <Task> CreateByPropertyName(IValidatableSchema entity,
                                                       PropertyInfo[] properties,
                                                       string propertyName,
                                                       string[] rules,
                                                       ValidationResult result)
        {
            ValidateRulesAndResultObject(rules, result);

            var property = properties.FirstOrDefault(p => p.Name.Equals(propertyName));
            var tasks    = new List <Task>();

            ValidateProperty(propertyName, property);
            var propertyValue = property.GetValue(entity);


            foreach (var rule in rules)
            {
                switch (rule)
                {
                case RuleName.REQUIRED:
                    tasks.Add(new Task(() => result.Add(CommonValidations.IsRequired(property, propertyValue))));
                    break;

                case string r when r.Contains(RuleName.MIN):
                    tasks.Add(new Task(() => result.Add(CreateValidationForMin(property, propertyValue, rule))));

                    break;

                case string r when r.Contains(RuleName.MAX):
                    tasks.Add(new Task(() => result.Add(CreateValidationForMax(property, propertyValue, rule))));

                    break;

                case string r when r.Contains(RuleName.GUID):
                    tasks.Add(new Task(() => result.Add(CreateValidationForGuid(property, propertyValue, rule))));

                    break;

                case RuleName.EMAIL:
                    tasks.Add(new Task(() => result.Add(EmailValidations.IsEmail(property, propertyValue))));
                    break;

                case RuleName.CNPJ:
                    tasks.Add(new Task(() => result.Add(CnpjValidations.IsCnpj(property, propertyValue))));
                    break;

                case RuleName.CPF:
                    tasks.Add(new Task(() => result.Add(CpfValidations.IsCpf(property, propertyValue))));
                    break;

                default:
                    throw new RuleNotSupportedException(rule);
                }
            }

            return(tasks);
        }