Browse Source

Refactor `TryToMapCollection` method.

pull/21660/head
maliming 2 years ago
parent
commit
803159bc1f
No known key found for this signature in database GPG Key ID: A646B9CB645ECEA4
  1. 27
      framework/src/Volo.Abp.ObjectMapping/Volo/Abp/ObjectMapping/DefaultObjectMapper.cs
  2. 2
      framework/test/Volo.Abp.AutoMapper.Tests/Volo/Abp/AutoMapper/AbpAutoMapperModule_Basic_Tests.cs
  3. 14
      framework/test/Volo.Abp.AutoMapper.Tests/Volo/Abp/AutoMapper/SampleClasses/MyEnum.cs
  4. 14
      framework/test/Volo.Abp.AutoMapper.Tests/Volo/Abp/AutoMapper/SampleClasses/MyEnumDto.cs

27
framework/src/Volo.Abp.ObjectMapping/Volo/Abp/ObjectMapping/DefaultObjectMapper.cs

@ -55,13 +55,9 @@ public class DefaultObjectMapper : IObjectMapper, ITransientDependency
return specificMapper.Map(source); return specificMapper.Map(source);
} }
if (!(typeof(TSource).IsEnum || typeof(TSource).IsPrimitive)) if (TryToMapCollection<TSource, TDestination>(scope, source, default, out var collectionResult))
{ {
var result = TryToMapCollection<TSource, TDestination>(scope, source, default); return collectionResult;
if (result != null)
{
return result;
}
} }
} }
@ -103,10 +99,9 @@ public class DefaultObjectMapper : IObjectMapper, ITransientDependency
return specificMapper.Map(source, destination); return specificMapper.Map(source, destination);
} }
var result = TryToMapCollection(scope, source, destination); if (TryToMapCollection(scope, source, destination, out var collectionResult))
if (result != null)
{ {
return result; return collectionResult;
} }
} }
@ -125,11 +120,12 @@ public class DefaultObjectMapper : IObjectMapper, ITransientDependency
return AutoMap(source, destination); return AutoMap(source, destination);
} }
protected virtual TDestination? TryToMapCollection<TSource, TDestination>(IServiceScope serviceScope, TSource source, TDestination? destination) protected virtual bool TryToMapCollection<TSource, TDestination>(IServiceScope serviceScope, TSource source, TDestination? destination, out TDestination collectionResult)
{ {
if (!IsCollectionGenericType<TSource, TDestination>(out var sourceArgumentType, out var destinationArgumentType, out var definitionGenericType)) if (!IsCollectionGenericType<TSource, TDestination>(out var sourceArgumentType, out var destinationArgumentType, out var definitionGenericType))
{ {
return default; collectionResult = default!;
return false;
} }
var mapperType = typeof(IObjectMapper<,>).MakeGenericType(sourceArgumentType, destinationArgumentType); var mapperType = typeof(IObjectMapper<,>).MakeGenericType(sourceArgumentType, destinationArgumentType);
@ -137,7 +133,8 @@ public class DefaultObjectMapper : IObjectMapper, ITransientDependency
if (specificMapper == null) if (specificMapper == null)
{ {
//skip, no specific mapper //skip, no specific mapper
return default; collectionResult = default!;
return false;
} }
var cacheKey = $"{mapperType.FullName}_{(destination == null ? "MapMethodWithSingleParameter" : "MapMethodWithDoubleParameters")}"; var cacheKey = $"{mapperType.FullName}_{(destination == null ? "MapMethodWithSingleParameter" : "MapMethodWithDoubleParameters")}";
@ -212,11 +209,13 @@ public class DefaultObjectMapper : IObjectMapper, ITransientDependency
if (destination != null && destination.GetType().IsArray) if (destination != null && destination.GetType().IsArray)
{ {
//Return the new collection if destination is an array, We won't change array just same behavior as AutoMapper. //Return the new collection if destination is an array, We won't change array just same behavior as AutoMapper.
return (TDestination)result; collectionResult = (TDestination)result;
return true;
} }
//Return the destination if destination exists. The parameter reference equals with return object. //Return the destination if destination exists. The parameter reference equals with return object.
return destination ?? (TDestination)result; collectionResult = destination ?? (TDestination)result;
return true;
} }
protected virtual bool IsCollectionGenericType<TSource, TDestination>(out Type sourceArgumentType, out Type destinationArgumentType, out Type definitionGenericType) protected virtual bool IsCollectionGenericType<TSource, TDestination>(out Type sourceArgumentType, out Type destinationArgumentType, out Type definitionGenericType)

2
framework/test/Volo.Abp.AutoMapper.Tests/Volo/Abp/AutoMapper/AbpAutoMapperModule_Basic_Tests.cs

@ -41,7 +41,7 @@ public class AbpAutoMapperModule_Basic_Tests : AbpIntegratedTest<AutoMapperTestM
public void Should_Map_Enum() public void Should_Map_Enum()
{ {
var dto = _objectMapper.Map<MyEnum, MyEnumDto>(MyEnum.Value3); var dto = _objectMapper.Map<MyEnum, MyEnumDto>(MyEnum.Value3);
dto.ShouldBe(MyEnumDto.Value3); dto.ShouldBe(MyEnumDto.Value2); //Value2 is same as Value3
} }
//[Fact] TODO: Disabled because of https://github.com/AutoMapper/AutoMapper/pull/2379#issuecomment-355899664 //[Fact] TODO: Disabled because of https://github.com/AutoMapper/AutoMapper/pull/2379#issuecomment-355899664

14
framework/test/Volo.Abp.AutoMapper.Tests/Volo/Abp/AutoMapper/SampleClasses/MyEnum.cs

@ -1,8 +1,8 @@
using System; namespace Volo.Abp.AutoMapper.SampleClasses;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Volo.Abp.AutoMapper.SampleClasses; public enum MyEnum
public enum MyEnum { Value1, Value2, Value3 }; {
Value1 = 1,
Value2,
Value3
}

14
framework/test/Volo.Abp.AutoMapper.Tests/Volo/Abp/AutoMapper/SampleClasses/MyEnumDto.cs

@ -1,8 +1,8 @@
using System; namespace Volo.Abp.AutoMapper.SampleClasses;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Volo.Abp.AutoMapper.SampleClasses; public enum MyEnumDto
public enum MyEnumDto { Value1, Value2, Value3 }; {
Value1 = 2,
Value2,
Value3
}

Loading…
Cancel
Save