diff --git a/framework/src/Volo.Abp.AutoMapper/Volo/Abp/AutoMapper/AbpAutoMapperConfigurationContext.cs b/framework/src/Volo.Abp.AutoMapper/Volo/Abp/AutoMapper/AbpAutoMapperConfigurationContext.cs index ee7630c122..c8754abd37 100644 --- a/framework/src/Volo.Abp.AutoMapper/Volo/Abp/AutoMapper/AbpAutoMapperConfigurationContext.cs +++ b/framework/src/Volo.Abp.AutoMapper/Volo/Abp/AutoMapper/AbpAutoMapperConfigurationContext.cs @@ -6,6 +6,7 @@ namespace Volo.Abp.AutoMapper; public class AbpAutoMapperConfigurationContext : IAbpAutoMapperConfigurationContext { public IMapperConfigurationExpression MapperConfiguration { get; } + public IServiceProvider ServiceProvider { get; } public AbpAutoMapperConfigurationContext( 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 18fef842da..bac015c287 100644 --- a/framework/src/Volo.Abp.AutoMapper/Volo/Abp/AutoMapper/AbpAutoMapperModule.cs +++ b/framework/src/Volo.Abp.AutoMapper/Volo/Abp/AutoMapper/AbpAutoMapperModule.cs @@ -26,45 +26,31 @@ public class AbpAutoMapperModule : AbpModule { context.Services.AddAutoMapperObjectMapper(); - context.Services.AddSingleton(CreateMappings); - context.Services.AddSingleton(provider => provider.GetRequiredService()); - } - - private MapperAccessor CreateMappings(IServiceProvider serviceProvider) - { - using (var scope = serviceProvider.CreateScope()) + context.Services.AddSingleton(sp => { - var options = scope.ServiceProvider.GetRequiredService>().Value; - - void ConfigureAll(IAbpAutoMapperConfigurationContext ctx) + using (var scope = sp.CreateScope()) { - foreach (var configurator in options.Configurators) + var options = scope.ServiceProvider.GetRequiredService>().Value; + + var mapperConfiguration = new MapperConfiguration(mapperConfigurationExpression => { - configurator(ctx); - } - } + var autoMapperConfigurationContext = new AbpAutoMapperConfigurationContext(mapperConfigurationExpression, scope.ServiceProvider); - options.Configurators.Insert(0, ctx => ctx.MapperConfiguration.ConstructServicesUsing(serviceProvider.GetService)); + foreach (var configurator in options.Configurators) + { + configurator(autoMapperConfigurationContext); + } + }); - void ValidateAll(IConfigurationProvider config) - { foreach (var profileType in options.ValidatingProfiles) { - config.Internal().AssertConfigurationIsValid(((Profile)Activator.CreateInstance(profileType)).ProfileName); + mapperConfiguration.Internal().AssertConfigurationIsValid(((Profile)Activator.CreateInstance(profileType)).ProfileName); } - } - - var mapperConfiguration = new MapperConfiguration(mapperConfigurationExpression => - { - ConfigureAll(new AbpAutoMapperConfigurationContext(mapperConfigurationExpression, scope.ServiceProvider)); - }); - ValidateAll(mapperConfiguration); + return mapperConfiguration; + } + }); - return new MapperAccessor - { - Mapper = new Mapper(mapperConfiguration) - }; - } + context.Services.AddTransient(sp => sp.GetRequiredService().CreateMapper(sp.GetService)); } } diff --git a/framework/src/Volo.Abp.AutoMapper/Volo/Abp/AutoMapper/AutoMapperAutoObjectMappingProvider.cs b/framework/src/Volo.Abp.AutoMapper/Volo/Abp/AutoMapper/AutoMapperAutoObjectMappingProvider.cs index 50c41c2ef5..a74ea7b57e 100644 --- a/framework/src/Volo.Abp.AutoMapper/Volo/Abp/AutoMapper/AutoMapperAutoObjectMappingProvider.cs +++ b/framework/src/Volo.Abp.AutoMapper/Volo/Abp/AutoMapper/AutoMapperAutoObjectMappingProvider.cs @@ -1,31 +1,37 @@ -using Volo.Abp.ObjectMapping; +using System; +using AutoMapper; +using Volo.Abp.ObjectMapping; namespace Volo.Abp.AutoMapper; public class AutoMapperAutoObjectMappingProvider : AutoMapperAutoObjectMappingProvider, IAutoObjectMappingProvider { - public AutoMapperAutoObjectMappingProvider(IMapperAccessor mapperAccessor) - : base(mapperAccessor) + public AutoMapperAutoObjectMappingProvider(IMapper mapper) + : base(mapper) { } } -public class AutoMapperAutoObjectMappingProvider : IAutoObjectMappingProvider +public class AutoMapperAutoObjectMappingProvider : IAutoObjectMappingProvider, IDisposable { - public IMapperAccessor MapperAccessor { get; } + public IMapper Mapper { get; } - public AutoMapperAutoObjectMappingProvider(IMapperAccessor mapperAccessor) + public AutoMapperAutoObjectMappingProvider(IMapper mapper) { - MapperAccessor = mapperAccessor; + Mapper = mapper; } public virtual TDestination Map(object source) { - return MapperAccessor.Mapper.Map(source); + return Mapper.Map(source); } public virtual TDestination Map(TSource source, TDestination destination) { - return MapperAccessor.Mapper.Map(source, destination); + return Mapper.Map(source, destination); + } + + public void Dispose() + { } } diff --git a/framework/src/Volo.Abp.AutoMapper/Volo/Abp/AutoMapper/IMapperAccessor.cs b/framework/src/Volo.Abp.AutoMapper/Volo/Abp/AutoMapper/IMapperAccessor.cs deleted file mode 100644 index 9997289a22..0000000000 --- a/framework/src/Volo.Abp.AutoMapper/Volo/Abp/AutoMapper/IMapperAccessor.cs +++ /dev/null @@ -1,8 +0,0 @@ -using AutoMapper; - -namespace Volo.Abp.AutoMapper; - -public interface IMapperAccessor -{ - IMapper Mapper { get; } -} diff --git a/framework/src/Volo.Abp.AutoMapper/Volo/Abp/AutoMapper/MapperAccessor.cs b/framework/src/Volo.Abp.AutoMapper/Volo/Abp/AutoMapper/MapperAccessor.cs deleted file mode 100644 index d35049eeff..0000000000 --- a/framework/src/Volo.Abp.AutoMapper/Volo/Abp/AutoMapper/MapperAccessor.cs +++ /dev/null @@ -1,8 +0,0 @@ -using AutoMapper; - -namespace Volo.Abp.AutoMapper; - -internal class MapperAccessor : IMapperAccessor -{ - public IMapper Mapper { get; set; } -} diff --git a/framework/src/Volo.Abp.AutoMapper/Volo/Abp/ObjectMapping/AbpAutoMapperObjectMapperExtensions.cs b/framework/src/Volo.Abp.AutoMapper/Volo/Abp/ObjectMapping/AbpAutoMapperObjectMapperExtensions.cs index 33d73a77e6..91511586d3 100644 --- a/framework/src/Volo.Abp.AutoMapper/Volo/Abp/ObjectMapping/AbpAutoMapperObjectMapperExtensions.cs +++ b/framework/src/Volo.Abp.AutoMapper/Volo/Abp/ObjectMapping/AbpAutoMapperObjectMapperExtensions.cs @@ -14,7 +14,7 @@ public static class AbpAutoMapperObjectMapperExtensions { if (autoObjectMappingProvider is AutoMapperAutoObjectMappingProvider autoMapperAutoObjectMappingProvider) { - return autoMapperAutoObjectMappingProvider.MapperAccessor.Mapper; + return autoMapperAutoObjectMappingProvider.Mapper; } throw new AbpException($"Given object is not an instance of {typeof(AutoMapperAutoObjectMappingProvider).AssemblyQualifiedName}. The type of the given object it {autoObjectMappingProvider.GetType().AssemblyQualifiedName}"); 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 index 5dadd2cc6e..7ed652a4d7 100644 --- 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 @@ -1,6 +1,7 @@ using System; using AutoMapper; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection.Extensions; using Shouldly; using Volo.Abp.Modularity; using Volo.Abp.Testing; @@ -25,6 +26,7 @@ public class AutoMapper_CustomServiceConstruction_Tests : AbpIntegratedTest(source).Name.ShouldBe(nameof(CustomMappingAction)); } @@ -33,6 +35,9 @@ public class AutoMapper_CustomServiceConstruction_Tests : AbpIntegratedTest(sp => sp.GetRequiredService().CreateMapper())); + Configure(options => { options.AddMaps(); 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 164a9c41cd..2df82d386e 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 @@ -1,4 +1,6 @@ -using AutoMapper; +using System; +using AutoMapper; +using Microsoft.Extensions.DependencyInjection; using Shouldly; using Volo.Abp.DependencyInjection; using Volo.Abp.Testing; @@ -9,13 +11,6 @@ namespace Volo.Abp.AutoMapper; public class AutoMapper_Dependency_Injection_Tests : AbpIntegratedTest { - private readonly IObjectMapper _objectMapper; - - public AutoMapper_Dependency_Injection_Tests() - { - _objectMapper = GetRequiredService(); - } - [Fact] public void Should_Registered_AutoMapper_Service() { @@ -30,7 +25,12 @@ public class AutoMapper_Dependency_Injection_Tests : AbpIntegratedTest(sourceModel).Name.ShouldBe(nameof(CustomMappingActionService)); + using (var scope = ServiceProvider.CreateScope()) + { + scope.ServiceProvider.GetRequiredService().Map(sourceModel).Name.ShouldBe(nameof(CustomMappingActionService)); + } + + CustomMappingAction.IsDisposed.ShouldBeTrue(); } public class SourceModel @@ -51,8 +51,10 @@ public class AutoMapper_Dependency_Injection_Tests : AbpIntegratedTest + public class CustomMappingAction : IMappingAction, IDisposable { + public static bool IsDisposed = false; + private readonly CustomMappingActionService _customMappingActionService; public CustomMappingAction(CustomMappingActionService customMappingActionService) @@ -64,6 +66,11 @@ public class AutoMapper_Dependency_Injection_Tests : AbpIntegratedTest