public IValidationResult <T> Validate <T>(T model, Func <IValidationOptions, IValidationOptions> setOptions = null) where T : class { if (!Types.Contains(typeof(T))) { throw new SpecificationNotFoundException(typeof(T)); } var validationOptions = setOptions != null ? OptionsService.GetVerifiedValidationOptions(setOptions(Options.ValidationOptions)) : Options.ValidationOptions; var defaultTranslator = validationOptions.TranslationName != null ? TranslatorsRepository.Get(validationOptions.TranslationName) : TranslatorsRepository.GetOriginal(); var translationProxy = new TranslationProxy(defaultTranslator, TranslatorsRepository); if (model == null) { switch (validationOptions.NullRootStrategy) { case NullRootStrategy.ArgumentNullException: { throw new ArgumentNullException(nameof(model)); } case NullRootStrategy.NoErrors: { return(new ValidationResult <T>(Id, translationProxy, Options.ValidationOptions)); } default: { var report = new ErrorsCollection(); report.AddError(Options.ValidationOptions.RequiredError); return(new ValidationResult <T>(Id, translationProxy, Options.ValidationOptions, null, report)); } } } var specification = ValidatorsFactory.GetOrInit <T>(); var executionContext = new ExecutionContext(validationOptions, ValidatorsFactory); var errorsCollection = ValidatorExecutor.Execute(specification, model, executionContext, validationOptions.ValidationStrategy, 0); return(new ValidationResult <T>(Id, translationProxy, Options.ValidationOptions, model, errorsCollection)); }
public MemberScope(PropertyInfo memberPropertyInfo, MemberSpecification <TModel, TMember> memberSpecification) { MemberPropertyInfo = memberPropertyInfo ?? throw new ArgumentNullException(nameof(memberPropertyInfo)); MemberValidator = MemberValidatorCreator.Create(memberSpecification ?? (m => m)); Name = memberPropertyInfo.Name; _getErrors = (executableRule, model, executionContext, validationStrategy, depth) => { var memberValue = model != null ? (TMember)executableRule.MemberPropertyInfo.GetValue(model) : default; return(ValidatorExecutor.ExecuteMember( executableRule.MemberValidator, model, memberValue, executionContext, validationStrategy, depth )); }; }