From 45f778cb94e8405772d865983c386b4b727974e5 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Thu, 4 Feb 2021 11:31:08 +0800 Subject: [PATCH] Allow custom services construction --- .../Abp/AutoMapper/AbpAutoMapperModule.cs | 6 +- ...oMapper_CustomServiceConstruction_Tests.cs | 74 +++++++++++++++++++ .../AutoMapper_Dependency_Injection_Tests.cs | 23 +++++- 3 files changed, 97 insertions(+), 6 deletions(-) create mode 100644 framework/test/Volo.Abp.AutoMapper.Tests/Volo/Abp/AutoMapper/AutoMapper_CustomServiceConstruction_Tests.cs 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 25707e3899..cb576ba1de 100644 --- a/framework/src/Volo.Abp.AutoMapper/Volo/Abp/AutoMapper/AbpAutoMapperModule.cs +++ b/framework/src/Volo.Abp.AutoMapper/Volo/Abp/AutoMapper/AbpAutoMapperModule.cs @@ -25,7 +25,7 @@ namespace Volo.Abp.AutoMapper { context.Services.AddAutoMapperObjectMapper(); - context.Services.AddSingleton(provider => CreateMappings(provider)); + context.Services.AddSingleton(CreateMappings); context.Services.AddSingleton(provider => provider.GetRequiredService()); } @@ -43,6 +43,8 @@ namespace Volo.Abp.AutoMapper } } + options.Configurators.Insert(0, ctx => ctx.MapperConfiguration.ConstructServicesUsing(serviceProvider.GetService)); + void ValidateAll(IConfigurationProvider config) { foreach (var profileType in options.ValidatingProfiles) @@ -60,7 +62,7 @@ namespace Volo.Abp.AutoMapper return new MapperAccessor { - Mapper = new Mapper(mapperConfiguration, serviceProvider.GetService) + Mapper = new Mapper(mapperConfiguration) }; } } diff --git a/framework/test/Volo.Abp.AutoMapper.Tests/Volo/Abp/AutoMapper/AutoMapper_CustomServiceConstruction_Tests.cs b/framework/test/Volo.Abp.AutoMapper.Tests/Volo/Abp/AutoMapper/AutoMapper_CustomServiceConstruction_Tests.cs new file mode 100644 index 0000000000..ab2f2309d5 --- /dev/null +++ b/framework/test/Volo.Abp.AutoMapper.Tests/Volo/Abp/AutoMapper/AutoMapper_CustomServiceConstruction_Tests.cs @@ -0,0 +1,74 @@ +using System; +using AutoMapper; +using Microsoft.Extensions.DependencyInjection; +using Shouldly; +using Volo.Abp.AutoMapper.SampleClasses; +using Volo.Abp.Modularity; +using Volo.Abp.Testing; +using Xunit; +using IObjectMapper = Volo.Abp.ObjectMapping.IObjectMapper; + +namespace Volo.Abp.AutoMapper +{ + public class AutoMapper_CustomServiceConstruction_Tests : AbpIntegratedTest + { + private readonly IObjectMapper _objectMapper; + + public AutoMapper_CustomServiceConstruction_Tests() + { + _objectMapper = ServiceProvider.GetRequiredService(); + } + + [Fact] + public void Should_Custom_Service_Construction() + { + var myEntity = new MyEntity + { + Number = 2 + }; + _objectMapper.Map(myEntity).Number.ShouldBe(1); + } + + [DependsOn(typeof(AbpAutoMapperModule))] + public class TestModule : AbpModule + { + public override void ConfigureServices(ServiceConfigurationContext context) + { + Configure(options => + { + options.AddMaps(); + options.Configurators.Add(configurationContext => + { + configurationContext.MapperConfiguration.ConstructServicesUsing(type => + type.Name.Contains(nameof(CustomMappingAction)) + ? new CustomMappingAction(1) + : Activator.CreateInstance(type)); + }); + }); + } + } + + public class MapperActionProfile : Profile + { + public MapperActionProfile() + { + CreateMap().AfterMap(); + } + } + + public class CustomMappingAction : IMappingAction + { + private readonly int _number; + + public CustomMappingAction(int number) + { + _number = number; + } + + public void Process(MyEntity source, MyEntityDto destination, ResolutionContext context) + { + destination.Number = _number; + } + } + } +} diff --git a/framework/test/Volo.Abp.AutoMapper.Tests/Volo/Abp/AutoMapper/AutoMapper_Dependency_Injection_Tests.cs b/framework/test/Volo.Abp.AutoMapper.Tests/Volo/Abp/AutoMapper/AutoMapper_Dependency_Injection_Tests.cs index 56c5e6f061..7edf32eb23 100644 --- a/framework/test/Volo.Abp.AutoMapper.Tests/Volo/Abp/AutoMapper/AutoMapper_Dependency_Injection_Tests.cs +++ b/framework/test/Volo.Abp.AutoMapper.Tests/Volo/Abp/AutoMapper/AutoMapper_Dependency_Injection_Tests.cs @@ -19,7 +19,7 @@ namespace Volo.Abp.AutoMapper [Fact] public void Should_Registered_AutoMapper_Service() { - GetService().ShouldNotBeNull(); + GetService().ShouldNotBeNull(); } [Fact] @@ -47,15 +47,30 @@ namespace Volo.Abp.AutoMapper { public MapperActionProfile() { - CreateMap().AfterMap(); + CreateMap().AfterMap(); } } - public class CustomMappingActionService : IMappingAction + public class CustomMappingAction : IMappingAction { + private readonly CustomMappingActionService _customMappingActionService; + + public CustomMappingAction(CustomMappingActionService customMappingActionService) + { + _customMappingActionService = customMappingActionService; + } + public void Process(SourceModel source, DestModel destination, ResolutionContext context) { - destination.Name = nameof(CustomMappingActionService); + destination.Name = _customMappingActionService.GetName(); + } + } + + public class CustomMappingActionService : ITransientDependency + { + public string GetName() + { + return nameof(CustomMappingActionService); } } }