public ObjectMapper <TSource, TTarget> Create <TSource, TTarget>(ObjectMappingData <TSource, TTarget> mappingData)
        {
            var mappingExpressionFactory = _mappingExpressionFactories.First(mef => mef.IsFor(mappingData));
            var mappingExpression        = mappingExpressionFactory.Create(mappingData);

            if (mappingExpression.NodeType == ExpressionType.Default)
            {
                return(null);
            }

            mappingExpression = MappingFactory
                                .UseLocalSourceValueVariableIfAppropriate(mappingExpression, mappingData.MapperData);

            var mappingLambda = Expression.Lambda <MapperFunc <TSource, TTarget> >(
                mappingExpression,
                mappingData.MapperData.MappingDataObject);

            var mapper = new ObjectMapper <TSource, TTarget>(mappingLambda, mappingData);

            if (_creationCallbacksByKey == null)
            {
                return(mapper);
            }

            var creationCallbackKey = new MapperCreationCallbackKey(mappingData.MapperData);

            if (_creationCallbacksByKey.TryGetValue(creationCallbackKey, out var creationCallback))
            {
                creationCallback.Invoke(mapper);
            }

            return(mapper);
        }
Exemplo n.º 2
0
        public static ObjectMapperData For <TSource, TTarget>(ObjectMappingData <TSource, TTarget> mappingData)
        {
            int?dataSourceIndex;
            ObjectMapperData parentMapperData;
            IMembersSource   membersSource;

            if (mappingData.IsRoot)
            {
                parentMapperData = null;
                membersSource    = mappingData.MappingContext.MapperContext.RootMembersSource;
                dataSourceIndex  = null;
            }
            else if (UseExistingMapperData(mappingData, out var existingMapperData))
            {
                return(existingMapperData);
            }
            else
            {
                parentMapperData = mappingData.Parent.MapperData;
                membersSource    = mappingData.MapperKey.GetMembersSource(parentMapperData);
                dataSourceIndex  = membersSource.DataSourceIndex;
            }

            var sourceMember = membersSource.GetSourceMember <TSource, TTarget>().WithType(typeof(TSource));
            var targetMember = membersSource.GetTargetMember <TSource, TTarget>().WithType(typeof(TTarget));

            return(new ObjectMapperData(
                       mappingData,
                       sourceMember,
                       targetMember,
                       dataSourceIndex,
                       mappingData.DeclaredTypeMappingData?.MapperData,
                       parentMapperData,
                       mappingData.IsStandalone()));
        }
Exemplo n.º 3
0
        private static bool UseExistingMapperData <TSource, TTarget>(
            ObjectMappingData <TSource, TTarget> mappingData,
            out ObjectMapperData existingMapperData)
        {
            if (!mappingData.IsPartOfRepeatedMapping)
            {
                existingMapperData = null;
                return(false);
            }

            // RepeatedMappings are invoked through the entry point MapperData, which assigns
            // itself as the ObjectMappingData's parent. If a repeated mapping then needs to
            // do a runtime-typed child mapping, we're able to reuse the parent MapperData
            // by finding it from the entry point:
            var parentMapperData = mappingData.Parent.MapperData;
            var membersSource    = mappingData.MapperKey.GetMembersSource(parentMapperData);

            if (!(membersSource is IChildMembersSource childMembersSource))
            {
                existingMapperData = null;
                return(false);
            }

            var mapperTypes = new[] { typeof(TSource), typeof(TTarget) };

            existingMapperData = GetMapperDataOrNull(
                parentMapperData,
                mapperTypes,
                childMembersSource.TargetMemberRegistrationName);

            return(existingMapperData != null);
        }
        public ObjectMapper <TSource, TTarget> Create <TSource, TTarget>(ObjectMappingData <TSource, TTarget> mappingData)
        {
            var mappingExpression = MappingDataSourceSetFactory.CreateFor(mappingData).BuildValue();

            if (mappingExpression == Constants.EmptyExpression)
            {
                return(null);
            }

            mappingExpression = MappingFactory
                                .UseLocalSourceValueVariableIfAppropriate(mappingExpression, mappingData.MapperData);

            var mapper = new ObjectMapper <TSource, TTarget>(mappingExpression, mappingData);

            if (_creationCallbacksByKey == null)
            {
                return(mapper);
            }

            var creationCallbackKey = new MapperCreationCallbackKey(mappingData.MapperData);

            if (_creationCallbacksByKey.TryGetValue(creationCallbackKey, out var creationCallback))
            {
                creationCallback.Invoke(mapper);
            }

            return(mapper);
        }
        public ObjectMapper <TSource, TTarget> GetOrCreateRoot <TSource, TTarget>(ObjectMappingData <TSource, TTarget> mappingData)
        {
            if (StaticMapperCache <TSource, TTarget> .TryGetMapperFor(mappingData, out var mapper))
            {
                return(mapper);
            }

            var rootMapperKey = mappingData.EnsureRootMapperKey();

            mapper = (ObjectMapper <TSource, TTarget>)_rootMappersCache.GetOrAdd(
                rootMapperKey,
                key => key.MappingData.GetOrCreateMapper());

            return(mapper);
        }
Exemplo n.º 6
0
        public ObjectMapper <TSource, TTarget> Create <TSource, TTarget>(ObjectMappingData <TSource, TTarget> mappingData)
        {
            var mappingExpression = mappingData.MapperKey.MappingTypes.IsEnumerable
                ? _enumerableMappingExpressionFactory.Create(mappingData)
                : _complexTypeMappingExpressionFactory.Create(mappingData);

            mappingExpression = MappingFactory
                                .UseLocalSourceValueVariableIfAppropriate(mappingExpression, mappingData.MapperData);

            var mappingLambda = Expression.Lambda <MapperFunc <TSource, TTarget> >(
                mappingExpression,
                mappingData.MapperData.MappingDataObject);

            var mapper = new ObjectMapper <TSource, TTarget>(mappingLambda, mappingData.MapperData);

            return(mapper);
        }
Exemplo n.º 7
0
        public ObjectMapper <TSource, TTarget> GetOrCreateRoot <TSource, TTarget>(ObjectMappingData <TSource, TTarget> mappingData)
        {
            mappingData.MapperKey.MappingData = mappingData;

            var mapper = RootMapperCache <TSource, TTarget> .Mappers.GetOrAdd(
                mappingData.MapperKey,
                key =>
            {
                var mapperToCache = (ObjectMapper <TSource, TTarget>)key.MappingData.Mapper;

                key.MappingData = null;
                _rootCacheEmptiers.Add(CacheEmptier <TSource, TTarget> .Instance);

                return(mapperToCache);
            });

            return(mapper);
        }
Exemplo n.º 8
0
 public TTarget Map(ObjectMappingData <TSource, TTarget> mappingData) => _mapperFunc.Invoke(mappingData);
 public ChildMemberMappingData(ObjectMappingData <TSource, TTarget> parent, IMemberMapperData mapperData)
 {
     _parent    = parent;
     MapperData = mapperData;
 }
Exemplo n.º 10
0
 public ChildMemberMappingData(ObjectMappingData <TSource, TTarget> parent)
 {
     _parent = parent;
     _runtimeTypeGettersCache = parent.MapperContext.Cache.CreateScoped <IQualifiedMember, Func <TSource, Type> >();
 }