Ejemplo n.º 1
0
 public Validator(IModelDescriptorCollection descriptorCollection, IValidatorFactory factory, IServiceProvider serviceProvider)
 {
     _descriptorCollection = descriptorCollection ?? throw new ArgumentNullException(nameof(descriptorCollection));
     _factory         = factory ?? throw new ArgumentNullException(nameof(factory));
     _serviceProvider = serviceProvider ?? throw new ArgumentNullException(nameof(serviceProvider));
     if (!descriptorCollection.Contains(typeof(T)))
     {
         return;
     }
     _descriptor = descriptorCollection[typeof(T)];
     _ruleFor    = GetType().GetMethod(nameof(RuleFor));
 }
Ejemplo n.º 2
0
        private void InitRules(object parentValue, IEnumerable <PropertyMap> properties, bool isNestedProperties)
        {
            if (isNestedProperties && parentValue == null)
            {
                return;
            }

            foreach (var property in properties)
            {
                var    metadata         = property.Metadata.Where(p => p is ValidationMetadata).Cast <ValidationMetadata>().ToList();
                var    hasSubProperties = property.HasSubProperties;
                object rule             = null;
                if (metadata.Any() || hasSubProperties)
                {
                    rule = RuleFor(property.PropertyLambdaExpression, property.MemberType);

                    foreach (var info in metadata)
                    {
                        rule = info.ApplyRule(_descriptor, _serviceProvider, rule);
                    }
                }

                if (!hasSubProperties)
                {
                    continue;
                }

                if (!_descriptorCollection.Contains(property.MemberType))
                {
                    InitRules(property.GetValue(parentValue), property.SubProperties, true);
                }
                else
                {
                    var subValidatorType = typeof(IValidator <>).MakeGenericType(property.MemberType);
                    var subValidator     = _factory.GetValidator(property.MemberType);
                    if (property.GetValue(parentValue) == null)
                    {
                        continue;
                    }
                    Expression.Lambda(Expression.Call(Expression.Constant(rule),
                                                      "SetValidator", null,
                                                      Expression.Constant(subValidator, subValidatorType), Expression.Constant(null, typeof(string[])))).Compile()
                    .DynamicInvoke();
                }
            }
        }
Ejemplo n.º 3
0
        public void Build(Type dtoType, Type sourceType)
        {
            if (dtoType == null)
            {
                throw new ArgumentNullException(nameof(dtoType));
            }
            if (sourceType == null)
            {
                throw new ArgumentNullException(nameof(sourceType));
            }
            var typeMaps    = _provider.GetAllTypeMaps();
            var reverseMaps = new List <TypeMap>();

            bool IsSourceToDto(TypeMap typeMap)
            {
                if (!dtoType.IsAssignableFrom(typeMap.DestinationType) || !sourceType.IsAssignableFrom(typeMap.SourceType))
                {
                    return(false);
                }
                reverseMaps.Add(typeMap);
                return(true);
            }

            bool IsDtoToSource(TypeMap typeMap) => sourceType.IsAssignableFrom(typeMap.DestinationType) &&
            dtoType.IsAssignableFrom(typeMap.SourceType);

            foreach (var typeMap in typeMaps)
            {
                if (_modelDescriptorCollection.Contains(typeMap.SourceType) || IsSourceToDto(typeMap) || !IsDtoToSource(typeMap))
                {
                    continue;
                }

                var mapExpression  = GetMapExpression(typeMap.SourceType, typeMap.DestinationType);
                var memberBindings = GetMemberBindings(mapExpression);
                var maps           = new Dictionary <string, string>();
                var properties     = new List <PropertyMap>();
                var modelAttrs     = CombineAttributes(typeMap.SourceType.GetCustomAttributes(_options.InheritAttributes),
                                                       typeMap.DestinationType.GetCustomAttributes(_options.InheritAttributes), null, null);
                var metadata = modelAttrs.Select(p => _metadataTransformHandler.Handle(new TransformContext(p, typeMap.SourceType, typeMap.DestinationType)))
                               .Where(data => data != null).ToList();

                foreach (var binding in memberBindings)
                {
                    BuildPropertyMap(typeMap.SourceType, typeMap.DestinationType, binding, properties, maps, true);
                }

                var descriptor = new ModelDescriptor(typeMap.SourceType,
                                                     typeMap.DestinationType,
                                                     new ReadOnlyCollection <PropertyMap>(properties),
                                                     null,
                                                     (PropertyDictionary)maps,
                                                     null,
                                                     metadata,
                                                     ModelMapDirection.DataTransferObjectToSource);
                _modelDescriptorCollection.Add(typeMap.SourceType, descriptor);
            }

            if (!reverseMaps.Any())
            {
                return;
            }

            foreach (var typeMap in reverseMaps)
            {
                var exists     = _modelDescriptorCollection.Contains(typeMap.DestinationType);
                var direction  = exists ? ModelMapDirection.Full : ModelMapDirection.SourceToDataTransferObject;
                var descriptor = exists
                                        ? _modelDescriptorCollection[typeMap.DestinationType]
                                        : new ModelDescriptor(typeMap.DestinationType,
                                                              typeMap.SourceType, null, null, null, null, null,
                                                              direction);
                var mapExpression  = GetMapExpression(typeMap.SourceType, typeMap.DestinationType);
                var memberBindings = GetMemberBindings(mapExpression);
                var maps           = new Dictionary <string, string>();
                var properties     = new List <PropertyMap>();

                foreach (var binding in memberBindings)
                {
                    BuildPropertyMap(typeMap.SourceType, typeMap.DestinationType, binding, properties, maps, false);
                }

                descriptor.SourceProperties = new ReadOnlyCollection <PropertyMap>(properties);
                descriptor.SourceMap        = (PropertyDictionary)maps;
                descriptor.SelectExpression = mapExpression;
                if (!exists)
                {
                    _modelDescriptorCollection.Add(typeMap.DestinationType, descriptor);
                }
            }

            foreach (var descriptor in _modelDescriptorCollection)
            {
                _inspectors.ForEach(inspector => inspector?.Inspect(descriptor));
            }
        }