コード例 #1
0
        public void ShouldSupportMappingFromSourceToDestination()
        {
            var typeMaps = _configuration.GetAllTypeMaps();

            foreach (var map in typeMaps)
            {
                var instance = Activator.CreateInstance(map.SourceType);
                _mapper.Map(instance, map.SourceType, map.DestinationType);
            }
        }
コード例 #2
0
        public static IMappingExpression <TSource, TDestination> IgnoreAllNonExisting <TSource, TDestination>(
            this IMappingExpression <TSource, TDestination> expression, IConfigurationProvider configuration)
        {
            var sourceType      = typeof(TSource);
            var destinationType = typeof(TDestination);
            var existingMaps    = configuration.GetAllTypeMaps().First(x => x.SourceType == sourceType &&
                                                                       x.DestinationType == destinationType);

            foreach (var property in existingMaps.GetUnmappedPropertyNames())
            {
                expression.ForMember(property, opt => opt.Ignore());
            }
            return(expression);
        }
コード例 #3
0
        /// <summary>
        /// 初始化映射配置
        /// </summary>
        private static void Init(Type sourceType, Type destinationType)
        {
            if (_config == null)
            {
                _config = new MapperConfiguration(t => t.CreateMap(sourceType, destinationType));
                return;
            }
            var maps = _config.GetAllTypeMaps();

            _config = new MapperConfiguration(t => t.CreateMap(sourceType, destinationType));
            foreach (var map in maps)
            {
                _config.RegisterTypeMap(map);
            }
        }
コード例 #4
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));
            }
        }