Browse Source

feat: Refactor mapping interfaces and classes for improved consistency and functionality

pull/23277/head
maliming 1 year ago
parent
commit
de946d6b72
No known key found for this signature in database GPG Key ID: A646B9CB645ECEA4
  1. 6
      framework/src/Volo.Abp.Mapperly/Volo/Abp/Mapperly/AbpMapperlyConventionalRegistrar.cs
  2. 4
      framework/src/Volo.Abp.Mapperly/Volo/Abp/Mapperly/AbpMapperlyMapperBase.cs
  3. 4
      framework/src/Volo.Abp.Mapperly/Volo/Abp/Mapperly/IAbpMapperlyMapper.cs
  4. 22
      framework/src/Volo.Abp.Mapperly/Volo/Abp/Mapperly/MapperlyAutoObjectMappingProvider.cs
  5. 2
      framework/test/Volo.Abp.Mapperly.Tests/Volo/Abp/Mapperly/AbpMapperlyBeforeAndAfterMethod_Tests.cs
  6. 4
      framework/test/Volo.Abp.Mapperly.Tests/Volo/Abp/Mapperly/AbpMapperlyModule_Basic_Tests.cs
  7. 2
      framework/test/Volo.Abp.Mapperly.Tests/Volo/Abp/Mapperly/AbpMapperly_Dependency_Injection_Tests.cs
  8. 2
      framework/test/Volo.Abp.Mapperly.Tests/Volo/Abp/Mapperly/AbpReverseMapperly_Tests.cs
  9. 8
      framework/test/Volo.Abp.Mapperly.Tests/Volo/Abp/Mapperly/SampleClasses/MapperlyMappers.cs

6
framework/src/Volo.Abp.Mapperly/Volo/Abp/Mapperly/AbpMapperlyConventionalRegistrar.cs

@ -9,7 +9,7 @@ public class AbpMapperlyConventionalRegistrar : DefaultConventionalRegistrar
{ {
protected override bool IsConventionalRegistrationDisabled(Type type) protected override bool IsConventionalRegistrationDisabled(Type type)
{ {
return !type.GetInterfaces().Any(x => x.IsGenericType && typeof(IAbpMapperly<,>) == x.GetGenericTypeDefinition()) || return !type.GetInterfaces().Any(x => x.IsGenericType && typeof(IAbpMapperlyMapper<,>) == x.GetGenericTypeDefinition()) ||
base.IsConventionalRegistrationDisabled(type); base.IsConventionalRegistrationDisabled(type);
} }
@ -17,8 +17,8 @@ public class AbpMapperlyConventionalRegistrar : DefaultConventionalRegistrar
{ {
var exposedServiceTypes = base.GetExposedServiceTypes(type); var exposedServiceTypes = base.GetExposedServiceTypes(type);
var mapperlyInterfaces = type.GetInterfaces().Where(x => var mapperlyInterfaces = type.GetInterfaces().Where(x =>
x.IsGenericType && (typeof(IAbpMapperly<,>) == x.GetGenericTypeDefinition() || x.IsGenericType && (typeof(IAbpMapperlyMapper<,>) == x.GetGenericTypeDefinition() ||
typeof(IAbpReverseMapperly<,>) == x.GetGenericTypeDefinition())); typeof(IAbpReverseMapperlyMapper<,>) == x.GetGenericTypeDefinition()));
return exposedServiceTypes return exposedServiceTypes
.Union(mapperlyInterfaces) .Union(mapperlyInterfaces)
.Distinct() .Distinct()

4
framework/src/Volo.Abp.Mapperly/Volo/Abp/Mapperly/AbpMapperlyBase.cs → framework/src/Volo.Abp.Mapperly/Volo/Abp/Mapperly/AbpMapperlyMapperBase.cs

@ -2,7 +2,7 @@ using Volo.Abp.DependencyInjection;
namespace Volo.Abp.Mapperly; namespace Volo.Abp.Mapperly;
public abstract class AbpMapperlyBase<TSource, TDestination> : IAbpMapperly<TSource, TDestination>, ITransientDependency public abstract class AbpMapperlyMapperBase<TSource, TDestination> : IAbpMapperlyMapper<TSource, TDestination>, ITransientDependency
{ {
public abstract TDestination Map(TSource source); public abstract TDestination Map(TSource source);
@ -16,7 +16,7 @@ public abstract class AbpMapperlyBase<TSource, TDestination> : IAbpMapperly<TSou
} }
} }
public abstract class AbpReverseMapperlyBase<TDestination, TSource> : AbpMapperlyBase<TSource, TDestination>, IAbpReverseMapperly<TDestination, TSource> public abstract class AbpReverseMapperlyMapperBase<TDestination, TSource> : AbpMapperlyMapperBase<TSource, TDestination>, IAbpReverseMapperlyMapper<TDestination, TSource>
{ {
public abstract TSource ReverseMap(TDestination destination); public abstract TSource ReverseMap(TDestination destination);

4
framework/src/Volo.Abp.Mapperly/Volo/Abp/Mapperly/IAbpMapperly.cs → framework/src/Volo.Abp.Mapperly/Volo/Abp/Mapperly/IAbpMapperlyMapper.cs

@ -1,6 +1,6 @@
namespace Volo.Abp.Mapperly; namespace Volo.Abp.Mapperly;
public interface IAbpMapperly<in TSource, TDestination> public interface IAbpMapperlyMapper<in TSource, TDestination>
{ {
TDestination Map(TSource source); TDestination Map(TSource source);
@ -11,7 +11,7 @@ public interface IAbpMapperly<in TSource, TDestination>
void AfterMap(TSource source, TDestination destination); void AfterMap(TSource source, TDestination destination);
} }
public interface IAbpReverseMapperly<TDestination, TSource> : IAbpMapperly<TSource, TDestination> public interface IAbpReverseMapperlyMapper<TDestination, TSource> : IAbpMapperlyMapper<TSource, TDestination>
{ {
TSource ReverseMap(TDestination destination); TSource ReverseMap(TDestination destination);

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

@ -28,7 +28,7 @@ public class MapperlyAutoObjectMappingProvider : IAutoObjectMappingProvider
public virtual TDestination Map<TSource, TDestination>(object source) public virtual TDestination Map<TSource, TDestination>(object source)
{ {
var mapper = ServiceProvider.GetService<IAbpMapperly<TSource, TDestination>>(); var mapper = ServiceProvider.GetService<IAbpMapperlyMapper<TSource, TDestination>>();
if (mapper != null) if (mapper != null)
{ {
mapper.BeforeMap((TSource)source); mapper.BeforeMap((TSource)source);
@ -38,23 +38,23 @@ public class MapperlyAutoObjectMappingProvider : IAutoObjectMappingProvider
return destination; return destination;
} }
var reverseMapper = ServiceProvider.GetService<IAbpReverseMapperly<TSource, TDestination>>(); var reverseMapper = ServiceProvider.GetService<IAbpReverseMapperlyMapper<TSource, TDestination>>();
if (reverseMapper != null) if (reverseMapper != null)
{ {
reverseMapper.BeforeReverseMap((TSource)source); reverseMapper.BeforeReverseMap((TSource)source);
var destination = reverseMapper.ReverseMap((TSource)source); var destination = reverseMapper.ReverseMap((TSource)source);
TryMapExtraProperties(reverseMapper.As<IAbpMapperly<TDestination, TSource>>(), destination, (TSource)source, GetExtraProperties(destination)); TryMapExtraProperties(reverseMapper.As<IAbpMapperlyMapper<TDestination, TSource>>(), destination, (TSource)source, GetExtraProperties(destination));
reverseMapper.AfterReverseMap((TSource)source, destination); reverseMapper.AfterReverseMap((TSource)source, destination);
return destination; return destination;
} }
throw new AbpException($"No {TypeHelper.GetFullNameHandlingNullableAndGenerics(typeof(IAbpMapperly<TSource, TDestination>))} or" + throw new AbpException($"No {TypeHelper.GetFullNameHandlingNullableAndGenerics(typeof(IAbpMapperlyMapper<TSource, TDestination>))} or" +
$" {TypeHelper.GetFullNameHandlingNullableAndGenerics(typeof(IAbpReverseMapperly<TSource, TDestination>))} was found"); $" {TypeHelper.GetFullNameHandlingNullableAndGenerics(typeof(IAbpReverseMapperlyMapper<TSource, TDestination>))} was found");
} }
public virtual TDestination Map<TSource, TDestination>(TSource source, TDestination destination) public virtual TDestination Map<TSource, TDestination>(TSource source, TDestination destination)
{ {
var mapper = ServiceProvider.GetService<IAbpMapperly<TSource, TDestination>>(); var mapper = ServiceProvider.GetService<IAbpMapperlyMapper<TSource, TDestination>>();
if (mapper != null) if (mapper != null)
{ {
mapper.BeforeMap(source); mapper.BeforeMap(source);
@ -65,19 +65,19 @@ public class MapperlyAutoObjectMappingProvider : IAutoObjectMappingProvider
return destination; return destination;
} }
var reverseMapper = ServiceProvider.GetService<IAbpReverseMapperly<TSource, TDestination>>(); var reverseMapper = ServiceProvider.GetService<IAbpReverseMapperlyMapper<TSource, TDestination>>();
if (reverseMapper != null) if (reverseMapper != null)
{ {
reverseMapper.BeforeReverseMap(source); reverseMapper.BeforeReverseMap(source);
var destinationExtraProperties = GetExtraProperties(destination); var destinationExtraProperties = GetExtraProperties(destination);
reverseMapper.ReverseMap(source, destination); reverseMapper.ReverseMap(source, destination);
TryMapExtraProperties(reverseMapper.As<IAbpReverseMapperly<TDestination, TSource>>(), source, destination, destinationExtraProperties); TryMapExtraProperties(reverseMapper.As<IAbpReverseMapperlyMapper<TDestination, TSource>>(), source, destination, destinationExtraProperties);
reverseMapper.AfterReverseMap(source, destination); reverseMapper.AfterReverseMap(source, destination);
return destination; return destination;
} }
throw new AbpException($"No {TypeHelper.GetFullNameHandlingNullableAndGenerics(typeof(IAbpMapperly<TSource, TDestination>))} or" + throw new AbpException($"No {TypeHelper.GetFullNameHandlingNullableAndGenerics(typeof(IAbpMapperlyMapper<TSource, TDestination>))} or" +
$" {TypeHelper.GetFullNameHandlingNullableAndGenerics(typeof(IAbpReverseMapperly<TSource, TDestination>))} was found"); $" {TypeHelper.GetFullNameHandlingNullableAndGenerics(typeof(IAbpReverseMapperlyMapper<TSource, TDestination>))} was found");
} }
protected virtual ExtraPropertyDictionary GetExtraProperties<TDestination>(TDestination destination) protected virtual ExtraPropertyDictionary GetExtraProperties<TDestination>(TDestination destination)
@ -95,7 +95,7 @@ public class MapperlyAutoObjectMappingProvider : IAutoObjectMappingProvider
return extraProperties; return extraProperties;
} }
protected virtual void TryMapExtraProperties<TSource, TDestination>(IAbpMapperly<TSource, TDestination> mapper, TSource source, TDestination destination, ExtraPropertyDictionary destinationExtraProperty) protected virtual void TryMapExtraProperties<TSource, TDestination>(IAbpMapperlyMapper<TSource, TDestination> mapper, TSource source, TDestination destination, ExtraPropertyDictionary destinationExtraProperty)
{ {
var mapToRegularPropertiesAttribute = mapper.GetType().GetSingleAttributeOrNull<MapExtraPropertiesAttribute>(); var mapToRegularPropertiesAttribute = mapper.GetType().GetSingleAttributeOrNull<MapExtraPropertiesAttribute>();
if (mapToRegularPropertiesAttribute != null && if (mapToRegularPropertiesAttribute != null &&

2
framework/test/Volo.Abp.Mapperly.Tests/Volo/Abp/Mapperly/AbpMapperlyBeforeAndAfterMethod_Tests.cs

@ -22,7 +22,7 @@ public class MyClassDto
} }
[Mapper] [Mapper]
public partial class MyClassMapper : AbpMapperlyBase<MyClass, MyClassDto> public partial class MyClassMapper : AbpMapperlyMapperBase<MyClass, MyClassDto>
{ {
public override partial MyClassDto Map(MyClass source); public override partial MyClassDto Map(MyClass source);

4
framework/test/Volo.Abp.Mapperly.Tests/Volo/Abp/Mapperly/AbpMapperlyModule_Basic_Tests.cs

@ -53,8 +53,8 @@ public class AbpMapperlyModule_Basic_Tests : AbpIntegratedTest<MapperlyTestModul
{ {
var exception = Assert.Throws<AbpException>(() =>_objectMapper.Map<MyEntity, MyClassDto>(new MyEntity())); var exception = Assert.Throws<AbpException>(() =>_objectMapper.Map<MyEntity, MyClassDto>(new MyEntity()));
exception.Message.ShouldBe("No " + exception.Message.ShouldBe("No " +
"Volo.Abp.Mapperly.IAbpMapperly<Volo.Abp.Mapperly.SampleClasses.MyEntity,Volo.Abp.Mapperly.MyClassDto> or " + "Volo.Abp.Mapperly.IAbpMapperlyMapper<Volo.Abp.Mapperly.SampleClasses.MyEntity,Volo.Abp.Mapperly.MyClassDto> or " +
"Volo.Abp.Mapperly.IAbpReverseMapperly<Volo.Abp.Mapperly.SampleClasses.MyEntity,Volo.Abp.Mapperly.MyClassDto>" + "Volo.Abp.Mapperly.IAbpReverseMapperlyMapper<Volo.Abp.Mapperly.SampleClasses.MyEntity,Volo.Abp.Mapperly.MyClassDto>" +
" was found"); " was found");
} }
} }

2
framework/test/Volo.Abp.Mapperly.Tests/Volo/Abp/Mapperly/AbpMapperly_Dependency_Injection_Tests.cs

@ -28,7 +28,7 @@ public class BirthdayCalculatorService : ITransientDependency
} }
[Mapper] [Mapper]
public partial class MyDIClassMapper : AbpMapperlyBase<MyDIClass, MyDIClassDto> public partial class MyDIClassMapper : AbpMapperlyMapperBase<MyDIClass, MyDIClassDto>
{ {
private readonly BirthdayCalculatorService _birthdayCalculatorService; private readonly BirthdayCalculatorService _birthdayCalculatorService;

2
framework/test/Volo.Abp.Mapperly.Tests/Volo/Abp/Mapperly/AbpReverseMapperly_Tests.cs

@ -22,7 +22,7 @@ public class MyReverseClassDto
} }
[Mapper] [Mapper]
public partial class MyReverseClassMapper : AbpReverseMapperlyBase<MyReverseClassDto, MyReverseClass> public partial class MyReverseClassMapper : AbpReverseMapperlyMapperBase<MyReverseClassDto, MyReverseClass>
{ {
public override partial MyReverseClassDto Map(MyReverseClass source); public override partial MyReverseClassDto Map(MyReverseClass source);

8
framework/test/Volo.Abp.Mapperly.Tests/Volo/Abp/Mapperly/SampleClasses/MapperlyMappers.cs

@ -4,7 +4,7 @@ using Volo.Abp.Mapperly.SampleClasses;
using Volo.Abp.ObjectExtending.TestObjects; using Volo.Abp.ObjectExtending.TestObjects;
[Mapper] [Mapper]
public partial class MyEntityMapper : AbpMapperlyBase<MyEntity, MyEntityDto> public partial class MyEntityMapper : AbpMapperlyMapperBase<MyEntity, MyEntityDto>
{ {
public override partial MyEntityDto Map(MyEntity source); public override partial MyEntityDto Map(MyEntity source);
@ -12,7 +12,7 @@ public partial class MyEntityMapper : AbpMapperlyBase<MyEntity, MyEntityDto>
} }
[Mapper] [Mapper]
public partial class MyEnumMapper : AbpMapperlyBase<MyEnum, MyEnumDto> public partial class MyEnumMapper : AbpMapperlyMapperBase<MyEnum, MyEnumDto>
{ {
public override partial MyEnumDto Map(MyEnum source); public override partial MyEnumDto Map(MyEnum source);
@ -24,7 +24,7 @@ public partial class MyEnumMapper : AbpMapperlyBase<MyEnum, MyEnumDto>
[Mapper] [Mapper]
[MapExtraProperties(IgnoredProperties = ["CityName"])] [MapExtraProperties(IgnoredProperties = ["CityName"])]
public partial class ExtensibleTestPersonMapper : AbpMapperlyBase<ExtensibleTestPerson, ExtensibleTestPersonDto> public partial class ExtensibleTestPersonMapper : AbpMapperlyMapperBase<ExtensibleTestPerson, ExtensibleTestPersonDto>
{ {
public override partial ExtensibleTestPersonDto Map(ExtensibleTestPerson source); public override partial ExtensibleTestPersonDto Map(ExtensibleTestPerson source);
@ -33,7 +33,7 @@ public partial class ExtensibleTestPersonMapper : AbpMapperlyBase<ExtensibleTest
[Mapper] [Mapper]
[MapExtraProperties(MapToRegularProperties = true)] [MapExtraProperties(MapToRegularProperties = true)]
public partial class ExtensibleTestPersonWithRegularPropertiesDtoMapper : AbpMapperlyBase<ExtensibleTestPerson, ExtensibleTestPersonWithRegularPropertiesDto> public partial class ExtensibleTestPersonWithRegularPropertiesDtoMapper : AbpMapperlyMapperBase<ExtensibleTestPerson, ExtensibleTestPersonWithRegularPropertiesDto>
{ {
[MapperIgnoreTarget(nameof(ExtensibleTestPersonWithRegularPropertiesDto.Name))] [MapperIgnoreTarget(nameof(ExtensibleTestPersonWithRegularPropertiesDto.Name))]
[MapperIgnoreTarget(nameof(ExtensibleTestPersonWithRegularPropertiesDto.Age))] [MapperIgnoreTarget(nameof(ExtensibleTestPersonWithRegularPropertiesDto.Age))]

Loading…
Cancel
Save