diff --git a/framework/src/Volo.Abp.AutoMapper/Volo/Abp/AutoMapper/AbpAutoMapAttribute.cs b/framework/src/Volo.Abp.AutoMapper/Volo/Abp/AutoMapper/AbpAutoMapAttribute.cs deleted file mode 100644 index 43004fc9f4..0000000000 --- a/framework/src/Volo.Abp.AutoMapper/Volo/Abp/AutoMapper/AbpAutoMapAttribute.cs +++ /dev/null @@ -1,29 +0,0 @@ -using System; -using System.Collections.Generic; -using AutoMapper; - -namespace Volo.Abp.AutoMapper -{ - public class AbpAutoMapAttribute : AbpAutoMapAttributeBase - { - public AbpAutoMapAttribute(params Type[] targetTypes) - : base(targetTypes) - { - - } - - public override void CreateMap(IMapperConfigurationExpression configuration, Type type) - { - if (TargetTypes.IsNullOrEmpty()) - { - return; - } - - foreach (var targetType in TargetTypes) - { - configuration.CreateMap(type, targetType, MemberList.Source); - configuration.CreateMap(targetType, type, MemberList.Destination); - } - } - } -} \ No newline at end of file diff --git a/framework/src/Volo.Abp.AutoMapper/Volo/Abp/AutoMapper/AbpAutoMapAttributeBase.cs b/framework/src/Volo.Abp.AutoMapper/Volo/Abp/AutoMapper/AbpAutoMapAttributeBase.cs deleted file mode 100644 index 75743e6186..0000000000 --- a/framework/src/Volo.Abp.AutoMapper/Volo/Abp/AutoMapper/AbpAutoMapAttributeBase.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System; -using AutoMapper; - -namespace Volo.Abp.AutoMapper -{ - public abstract class AbpAutoMapAttributeBase : Attribute - { - public Type[] TargetTypes { get; } - - protected AbpAutoMapAttributeBase(params Type[] targetTypes) - { - TargetTypes = targetTypes; - } - - public abstract void CreateMap(IMapperConfigurationExpression configuration, Type type); - } -} \ No newline at end of file diff --git a/framework/src/Volo.Abp.AutoMapper/Volo/Abp/AutoMapper/AbpAutoMapFromAttribute.cs b/framework/src/Volo.Abp.AutoMapper/Volo/Abp/AutoMapper/AbpAutoMapFromAttribute.cs deleted file mode 100644 index 4aca433dfa..0000000000 --- a/framework/src/Volo.Abp.AutoMapper/Volo/Abp/AutoMapper/AbpAutoMapFromAttribute.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System; -using System.Collections.Generic; -using AutoMapper; - -namespace Volo.Abp.AutoMapper -{ - public class AbpAutoMapFromAttribute : AbpAutoMapAttributeBase - { - public MemberList MemberList { get; set; } = MemberList.Destination; - - public AbpAutoMapFromAttribute(params Type[] targetTypes) - : base(targetTypes) - { - - } - - public AbpAutoMapFromAttribute(MemberList memberList, params Type[] targetTypes) - : this(targetTypes) - { - MemberList = memberList; - } - - public override void CreateMap(IMapperConfigurationExpression configuration, Type type) - { - if (TargetTypes.IsNullOrEmpty()) - { - return; - } - - foreach (var targetType in TargetTypes) - { - configuration.CreateMap(targetType, type, MemberList); - } - } - } -} \ No newline at end of file diff --git a/framework/src/Volo.Abp.AutoMapper/Volo/Abp/AutoMapper/AbpAutoMapToAttribute.cs b/framework/src/Volo.Abp.AutoMapper/Volo/Abp/AutoMapper/AbpAutoMapToAttribute.cs deleted file mode 100644 index bee84eb950..0000000000 --- a/framework/src/Volo.Abp.AutoMapper/Volo/Abp/AutoMapper/AbpAutoMapToAttribute.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System; -using System.Collections.Generic; -using AutoMapper; - -namespace Volo.Abp.AutoMapper -{ - public class AbpAutoMapToAttribute : AbpAutoMapAttributeBase - { - public MemberList MemberList { get; set; } = MemberList.Source; - - public AbpAutoMapToAttribute(params Type[] targetTypes) - : base(targetTypes) - { - - } - - public AbpAutoMapToAttribute(MemberList memberList, params Type[] targetTypes) - : this(targetTypes) - { - MemberList = memberList; - } - - public override void CreateMap(IMapperConfigurationExpression configuration, Type type) - { - if (TargetTypes.IsNullOrEmpty()) - { - return; - } - - foreach (var targetType in TargetTypes) - { - configuration.CreateMap(type, targetType, MemberList); - } - } - } -} \ No newline at end of file diff --git a/framework/src/Volo.Abp.AutoMapper/Volo/Abp/AutoMapper/AbpAutoMapperModule.cs b/framework/src/Volo.Abp.AutoMapper/Volo/Abp/AutoMapper/AbpAutoMapperModule.cs index e02ec8f85e..ebf517dc65 100644 --- a/framework/src/Volo.Abp.AutoMapper/Volo/Abp/AutoMapper/AbpAutoMapperModule.cs +++ b/framework/src/Volo.Abp.AutoMapper/Volo/Abp/AutoMapper/AbpAutoMapperModule.cs @@ -1,13 +1,9 @@ using System; -using System.Linq; -using System.Reflection; using AutoMapper; using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Volo.Abp.Modularity; using Volo.Abp.ObjectMapping; -using Volo.Abp.Reflection; namespace Volo.Abp.AutoMapper { @@ -34,7 +30,6 @@ namespace Volo.Abp.AutoMapper void ConfigureAll(IAbpAutoMapperConfigurationContext ctx) { - FindAndAutoMapTypes(ctx); foreach (var configurator in options.Configurators) { configurator(ctx); @@ -59,36 +54,5 @@ namespace Volo.Abp.AutoMapper scope.ServiceProvider.GetRequiredService().Mapper = mapperConfiguration.CreateMapper(); } } - - private void FindAndAutoMapTypes(IAbpAutoMapperConfigurationContext context) - { - //TODO: AutoMapping (by attributes) can be optionally enabled/disabled. - - var typeFinder = context.ServiceProvider.GetRequiredService(); - var logger = context.ServiceProvider.GetRequiredService>(); - - var types = typeFinder.Types.Where(type => - { - var typeInfo = type.GetTypeInfo(); - return typeInfo.IsDefined(typeof(AbpAutoMapAttribute)) || - typeInfo.IsDefined(typeof(AbpAutoMapFromAttribute)) || - typeInfo.IsDefined(typeof(AbpAutoMapToAttribute)); - } - ).ToArray(); - - if (types.Length <= 0) - { - logger.LogDebug($"No class found with auto mapping attributes."); - } - else - { - logger.LogDebug($"Found {types.Length} classes define auto mapping attributes."); - foreach (var type in types) - { - logger.LogDebug(type.FullName); - context.MapperConfiguration.CreateAutoAttributeMaps(type); - } - } - } } } diff --git a/framework/src/Volo.Abp.AutoMapper/Volo/Abp/AutoMapper/AutoMapperConfigurationExtensions.cs b/framework/src/Volo.Abp.AutoMapper/Volo/Abp/AutoMapper/AutoMapperConfigurationExtensions.cs deleted file mode 100644 index 6c4ca0326d..0000000000 --- a/framework/src/Volo.Abp.AutoMapper/Volo/Abp/AutoMapper/AutoMapperConfigurationExtensions.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System; -using System.Reflection; -using AutoMapper; - -namespace Volo.Abp.AutoMapper -{ - internal static class AutoMapperConfigurationExtensions - { - public static void CreateAutoAttributeMaps(this IMapperConfigurationExpression configuration, Type type) - { - foreach (var autoMapAttribute in type.GetTypeInfo().GetCustomAttributes()) - { - autoMapAttribute.CreateMap(configuration, type); - } - } - } -} \ No newline at end of file diff --git a/framework/test/Volo.Abp.AutoMapper.Tests/Volo/Abp/AutoMapper/AutofacTestModule.cs b/framework/test/Volo.Abp.AutoMapper.Tests/Volo/Abp/AutoMapper/AutoMapperTestModule.cs similarity index 69% rename from framework/test/Volo.Abp.AutoMapper.Tests/Volo/Abp/AutoMapper/AutofacTestModule.cs rename to framework/test/Volo.Abp.AutoMapper.Tests/Volo/Abp/AutoMapper/AutoMapperTestModule.cs index dbac30a805..3d873ccacf 100644 --- a/framework/test/Volo.Abp.AutoMapper.Tests/Volo/Abp/AutoMapper/AutofacTestModule.cs +++ b/framework/test/Volo.Abp.AutoMapper.Tests/Volo/Abp/AutoMapper/AutoMapperTestModule.cs @@ -8,7 +8,10 @@ namespace Volo.Abp.AutoMapper { public override void ConfigureServices(ServiceConfigurationContext context) { - + Configure(options => + { + options.AddMaps(); + }); } } } \ No newline at end of file diff --git a/framework/test/Volo.Abp.AutoMapper.Tests/Volo/Abp/AutoMapper/AutoMapper_Inheritance_Tests.cs b/framework/test/Volo.Abp.AutoMapper.Tests/Volo/Abp/AutoMapper/AutoMapper_Inheritance_Tests.cs deleted file mode 100644 index 16ad687858..0000000000 --- a/framework/test/Volo.Abp.AutoMapper.Tests/Volo/Abp/AutoMapper/AutoMapper_Inheritance_Tests.cs +++ /dev/null @@ -1,75 +0,0 @@ -using AutoMapper; -using Shouldly; -using Xunit; - -namespace Volo.Abp.AutoMapper -{ - public class AutoMapper_Inheritance_Tests - { - private readonly IMapper _mapper; - - public AutoMapper_Inheritance_Tests() - { - var config = new MapperConfiguration(configuration => - { - configuration.CreateAutoAttributeMaps(typeof(MyTargetClassToMap)); - configuration.CreateAutoAttributeMaps(typeof(EntityDto)); - configuration.CreateAutoAttributeMaps(typeof(DerivedEntityDto)); - }); - - _mapper = config.CreateMapper(); - } - - [Fact] - public void Should_Map_Derived_To_Target() - { - var derived = new MyDerivedClass { Value = "fortytwo" }; - var target = _mapper.Map(derived); - target.Value.ShouldBe("fortytwo"); - } - - public class MyBaseClass - { - public string Value { get; set; } - } - - public class MyDerivedClass : MyBaseClass - { - - } - - [AbpAutoMapFrom(typeof(MyBaseClass))] - public class MyTargetClassToMap - { - public string Value { get; set; } - } - - //[Fact] //TODO: That's a problem but related to AutoMapper rather than ABP. - public void Should_Map_EntityProxy_To_EntityDto_And_To_DrivedEntityDto() - { - var proxy = new EntityProxy() { Value = "42"}; - var target = _mapper.Map(proxy); - var target2 = _mapper.Map(proxy); - target.Value.ShouldBe("42"); - target2.Value.ShouldBe("42"); - } - - private class Entity - { - public string Value { get; set; } - } - - private class DerivedEntity : Entity { } - - private class EntityProxy : DerivedEntity { } - - [AbpAutoMapFrom(typeof(Entity))] - private class EntityDto - { - public string Value { get; set; } - } - - [AbpAutoMapFrom(typeof(DerivedEntity))] - private class DerivedEntityDto : EntityDto { } - } -} diff --git a/framework/test/Volo.Abp.AutoMapper.Tests/Volo/Abp/AutoMapper/AutoMapping_Tests.cs b/framework/test/Volo.Abp.AutoMapper.Tests/Volo/Abp/AutoMapper/AutoMapping_Tests.cs deleted file mode 100644 index 69f6aec506..0000000000 --- a/framework/test/Volo.Abp.AutoMapper.Tests/Volo/Abp/AutoMapper/AutoMapping_Tests.cs +++ /dev/null @@ -1,157 +0,0 @@ -using System; -using System.Collections.Generic; -using AutoMapper; -using Shouldly; -using Xunit; - -namespace Volo.Abp.AutoMapper -{ - public class AutoMapping_Tests - { - private readonly IMapper _mapper; - - public AutoMapping_Tests() - { - var config = new MapperConfiguration(configuration => - { - configuration.CreateAutoAttributeMaps(typeof(MyClass1)); - configuration.CreateAutoAttributeMaps(typeof(MyClass2)); - }); - - _mapper = config.CreateMapper(); - } - - [Fact] - public void Map_Null_Tests() - { - MyClass1 obj1 = null; - var obj2 = _mapper.Map(obj1); - obj2.ShouldBe(null); - } - - [Fact] - public void Map_Null_Existing_Object_Tests() - { - MyClass1 obj1 = null; - - var obj2 = new MyClass2 { TestProp = "before map" }; - _mapper.Map(obj1, obj2); - obj2.TestProp.ShouldBe("before map"); - } - - [Fact] - public void MapTo_Tests() - { - var obj1 = new MyClass1 { TestProp = "Test value" }; - - var obj2 = _mapper.Map(obj1); - obj2.TestProp.ShouldBe("Test value"); - - var obj3 = _mapper.Map(obj1); - obj3.TestProp.ShouldBe("Test value"); - } - - [Fact] - public void MapTo_Existing_Object_Tests() - { - var obj1 = new MyClass1 { TestProp = "Test value" }; - - var obj2 = new MyClass2(); - _mapper.Map(obj1, obj2); - obj2.TestProp.ShouldBe("Test value"); - - var obj3 = new MyClass3(); - _mapper.Map(obj2, obj3); - obj3.TestProp.ShouldBe("Test value"); - - Assert.ThrowsAny(() => //Did not define reverse mapping! - { - _mapper.Map(obj3, obj2); - }); - } - - [Fact] - public void MapFrom_Tests() - { - var obj2 = new MyClass2 { TestProp = "Test value" }; - - var obj1 = _mapper.Map(obj2); - obj1.TestProp.ShouldBe("Test value"); - } - - [Fact] - public void IgnoreMap_Tests() - { - var obj2 = new MyClass2 {TestProp = "Test value", AnotherValue = 42}; - var obj3 = _mapper.Map(obj2); - obj3.TestProp.ShouldBe("Test value"); - obj3.AnotherValue.ShouldBe(0); //Ignored because of IgnoreMap attribute! - } - - [Fact] - public void MapTo_Collection_Tests() - { - var list1 = new List - { - new MyClass1 {TestProp = "Test value 1"}, - new MyClass1 {TestProp = "Test value 2"} - }; - - var list2 = _mapper.Map>(list1); - list2.Count.ShouldBe(2); - list2[0].TestProp.ShouldBe("Test value 1"); - list2[1].TestProp.ShouldBe("Test value 2"); - } - - [Fact] - public void Map_Should_Set_Null_Existing_Object_Tests() - { - MyClass1 obj1 = new MyClass1 { TestProp = null }; - var obj2 = new MyClass2 { TestProp = "before map" }; - _mapper.Map(obj1, obj2); - obj2.TestProp.ShouldBe(null); - } - - [Fact] - public void Should_Map_Nullable_Value_To_Null_If_It_Is_Null_On_Source() - { - var obj1 = new MyClass1(); - var obj2 = _mapper.Map(obj1); - obj2.NullableValue.ShouldBeNull(); - } - - [Fact] - public void Should_Map_Nullable_Value_To__Not_Null_If_It_Is__Not_Null_On_Source() - { - var obj1 = new MyClass1 { NullableValue = 42 }; - var obj2 = _mapper.Map(obj1); - obj2.NullableValue.ShouldBe(42); - } - - [AbpAutoMap(typeof(MyClass2), typeof(MyClass3))] - private class MyClass1 - { - public string TestProp { get; set; } - - public long? NullableValue { get; set; } - } - - [AbpAutoMapTo(typeof(MyClass3))] - private class MyClass2 - { - public string TestProp { get; set; } - - public long? NullableValue { get; set; } - - public int AnotherValue { get; set; } - } - - private class MyClass3 - { - public string TestProp { get; set; } - - [IgnoreMap] - public int AnotherValue { get; set; } - } - } -} diff --git a/framework/test/Volo.Abp.AutoMapper.Tests/Volo/Abp/AutoMapper/SampleClasses/MyEntityDto.cs b/framework/test/Volo.Abp.AutoMapper.Tests/Volo/Abp/AutoMapper/SampleClasses/MyEntityDto.cs index df2d4aeebe..ff01da0cce 100644 --- a/framework/test/Volo.Abp.AutoMapper.Tests/Volo/Abp/AutoMapper/SampleClasses/MyEntityDto.cs +++ b/framework/test/Volo.Abp.AutoMapper.Tests/Volo/Abp/AutoMapper/SampleClasses/MyEntityDto.cs @@ -2,7 +2,6 @@ namespace Volo.Abp.AutoMapper.SampleClasses { - [AbpAutoMap(typeof(MyEntity))] public class MyEntityDto { public Guid Id { get; set; } diff --git a/framework/test/Volo.Abp.AutoMapper.Tests/Volo/Abp/AutoMapper/SampleClasses/MyMapProfile.cs b/framework/test/Volo.Abp.AutoMapper.Tests/Volo/Abp/AutoMapper/SampleClasses/MyMapProfile.cs new file mode 100644 index 0000000000..a65a7209e2 --- /dev/null +++ b/framework/test/Volo.Abp.AutoMapper.Tests/Volo/Abp/AutoMapper/SampleClasses/MyMapProfile.cs @@ -0,0 +1,12 @@ +using AutoMapper; + +namespace Volo.Abp.AutoMapper.SampleClasses +{ + public class MyMapProfile : Profile + { + public MyMapProfile() + { + CreateMap().ReverseMap(); + } + } +} diff --git a/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Domain/Person.cs b/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Domain/Person.cs index c9c7090d1d..16ac62589e 100644 --- a/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Domain/Person.cs +++ b/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Domain/Person.cs @@ -1,12 +1,10 @@ using System; using System.Collections.ObjectModel; -using Volo.Abp.AutoMapper; using Volo.Abp.Domain.Entities.Auditing; using Volo.Abp.MultiTenancy; namespace Volo.Abp.TestApp.Domain { - [AbpAutoMapTo(typeof(PersonEto))] public class Person : FullAuditedAggregateRoot, IMultiTenant { public virtual Guid? TenantId { get; set; } diff --git a/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Domain/TestAutoMapProfile.cs b/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Domain/TestAutoMapProfile.cs new file mode 100644 index 0000000000..8d1c6df146 --- /dev/null +++ b/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Domain/TestAutoMapProfile.cs @@ -0,0 +1,12 @@ +using AutoMapper; + +namespace Volo.Abp.TestApp.Domain +{ + public class TestAutoMapProfile : Profile + { + public TestAutoMapProfile() + { + CreateMap().ReverseMap(); + } + } +} diff --git a/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/TestAppModule.cs b/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/TestAppModule.cs index 747218984f..aea5013fef 100644 --- a/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/TestAppModule.cs +++ b/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/TestAppModule.cs @@ -37,6 +37,8 @@ namespace Volo.Abp.TestApp ctx.MapperConfiguration.CreateMap().ReverseMap(); ctx.MapperConfiguration.CreateMap().ReverseMap(); }); + + options.AddMaps(); }); }