Browse Source

Remove MapExtraPropertiesInvoker and update mapping logic

pull/23277/head
maliming 1 year ago
parent
commit
74589a9323
No known key found for this signature in database GPG Key ID: A646B9CB645ECEA4
  1. 71
      framework/src/Volo.Abp.Mapperly/Volo/Abp/Mapperly/MapExtraPropertiesInvoker.cs
  2. 8
      framework/src/Volo.Abp.Mapperly/Volo/Abp/Mapperly/MapperlyAutoObjectMappingProvider.cs

71
framework/src/Volo.Abp.Mapperly/Volo/Abp/Mapperly/MapExtraPropertiesInvoker.cs

@ -1,71 +0,0 @@
using System;
using System.Collections.Concurrent;
using System.Linq.Expressions;
using System.Reflection;
using Volo.Abp.Data;
using Volo.Abp.ObjectExtending;
namespace Volo.Abp.Mapperly;
public static class MapExtraPropertiesInvoker
{
private delegate void MapMethodDelegate(
object targetInstance,
IHasExtraProperties source,
IHasExtraProperties destination,
ExtraPropertyDictionary destinationExtraProperty,
MappingPropertyDefinitionChecks? definitionChecks,
string[]? ignoredProperties,
bool mapToRegularProperties);
private readonly static ConcurrentDictionary<(Type, Type), MapMethodDelegate> Cache = new();
private readonly static MethodInfo MethodDefinition = typeof(MapperlyAutoObjectMappingProvider).GetMethod("MapExtraProperties", BindingFlags.Instance | BindingFlags.NonPublic)!;
public static void Invoke<TSource, TDestination>(
object targetInstance,
IHasExtraProperties source,
IHasExtraProperties destination,
ExtraPropertyDictionary destinationExtraProperty,
MappingPropertyDefinitionChecks? definitionChecks = null,
string[]? ignoredProperties = null,
bool mapToRegularProperties = false)
{
var mapExtraProperties = Cache.GetOrAdd((typeof(TSource), typeof(TDestination)), static key =>
{
Check.NotNull(MethodDefinition, nameof(MethodDefinition));
var genericMethod = MethodDefinition.MakeGenericMethod(key.Item1, key.Item2);
var targetParam = Expression.Parameter(typeof(object), "target");
var sourceParam = Expression.Parameter(typeof(IHasExtraProperties), "source");
var destParam = Expression.Parameter(typeof(IHasExtraProperties), "destination");
var checksParam = Expression.Parameter(typeof(MappingPropertyDefinitionChecks?), "checks");
var destinationExtraPropertyParam = Expression.Parameter(typeof(ExtraPropertyDictionary), "destinationExtraProperty");
var ignoredParam = Expression.Parameter(typeof(string[]), "ignored");
var mapFlagParam = Expression.Parameter(typeof(bool), "mapFlag");
var instanceCast = Expression.Convert(targetParam, typeof(MapperlyAutoObjectMappingProvider));
var call = Expression.Call(
instanceCast,
genericMethod,
sourceParam,
destParam,
destinationExtraPropertyParam,
checksParam,
ignoredParam,
mapFlagParam
);
var lambda = Expression.Lambda<MapMethodDelegate>(
call,
targetParam, sourceParam, destParam, destinationExtraPropertyParam, checksParam, ignoredParam, mapFlagParam
);
return lambda.Compile();
});
mapExtraProperties(targetInstance, source, destination, destinationExtraProperty, definitionChecks, ignoredProperties, mapToRegularProperties);
}
}

8
framework/src/Volo.Abp.Mapperly/Volo/Abp/Mapperly/MapperlyAutoObjectMappingProvider.cs

@ -102,7 +102,7 @@ public class MapperlyAutoObjectMappingProvider : IAutoObjectMappingProvider
typeof(IHasExtraProperties).IsAssignableFrom(typeof(TDestination)) &&
typeof(IHasExtraProperties).IsAssignableFrom(typeof(TSource)))
{
MapExtraPropertiesInvoker.Invoke<TSource, TDestination>(this,
MapExtraProperties<TSource, TDestination>(
source!.As<IHasExtraProperties>(),
destination!.As<IHasExtraProperties>(),
destinationExtraProperty,
@ -120,8 +120,6 @@ public class MapperlyAutoObjectMappingProvider : IAutoObjectMappingProvider
MappingPropertyDefinitionChecks? definitionChecks = null,
string[]? ignoredProperties = null,
bool mapToRegularProperties = false)
where TSource : IHasExtraProperties
where TDestination : IHasExtraProperties
{
var result = destinationExtraProperty.IsNullOrEmpty()
? new Dictionary<string, object?>()
@ -130,7 +128,9 @@ public class MapperlyAutoObjectMappingProvider : IAutoObjectMappingProvider
if (source.ExtraProperties != null && destination.ExtraProperties != null)
{
ExtensibleObjectMapper
.MapExtraPropertiesTo<TSource, TDestination>(
.MapExtraPropertiesTo(
typeof(TSource),
typeof(TDestination),
source.ExtraProperties,
result,
definitionChecks,

Loading…
Cancel
Save