Browse Source

Merge pull request #14778 from abpframework/IMapperAccessor

No longer use `ConstructServicesUsing`.
pull/14810/head
Halil İbrahim Kalkan 4 years ago
committed by GitHub
parent
commit
12c47de22b
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 1
      framework/src/Volo.Abp.AutoMapper/Volo/Abp/AutoMapper/AbpAutoMapperConfigurationContext.cs
  2. 50
      framework/src/Volo.Abp.AutoMapper/Volo/Abp/AutoMapper/AbpAutoMapperModule.cs
  3. 1
      framework/src/Volo.Abp.AutoMapper/Volo/Abp/AutoMapper/AutoMapperAutoObjectMappingProvider.cs
  4. 2
      framework/src/Volo.Abp.AutoMapper/Volo/Abp/AutoMapper/MapperAccessor.cs
  5. 5
      framework/test/Volo.Abp.AutoMapper.Tests/Volo/Abp/AutoMapper/AutoMapper_CustomServiceConstruction_Tests.cs
  6. 27
      framework/test/Volo.Abp.AutoMapper.Tests/Volo/Abp/AutoMapper/AutoMapper_Dependency_Injection_Tests.cs

1
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(

50
framework/src/Volo.Abp.AutoMapper/Volo/Abp/AutoMapper/AbpAutoMapperModule.cs

@ -26,45 +26,37 @@ public class AbpAutoMapperModule : AbpModule
{
context.Services.AddAutoMapperObjectMapper();
context.Services.AddSingleton<MapperAccessor>(CreateMappings);
context.Services.AddSingleton<IMapperAccessor>(provider => provider.GetRequiredService<MapperAccessor>());
}
private MapperAccessor CreateMappings(IServiceProvider serviceProvider)
{
using (var scope = serviceProvider.CreateScope())
context.Services.AddSingleton<IConfigurationProvider>(sp =>
{
var options = scope.ServiceProvider.GetRequiredService<IOptions<AbpAutoMapperOptions>>().Value;
void ConfigureAll(IAbpAutoMapperConfigurationContext ctx)
using (var scope = sp.CreateScope())
{
foreach (var configurator in options.Configurators)
var options = scope.ServiceProvider.GetRequiredService<IOptions<AbpAutoMapperOptions>>().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));
});
return mapperConfiguration;
}
});
ValidateAll(mapperConfiguration);
context.Services.AddTransient<IMapper>(sp => sp.GetRequiredService<IConfigurationProvider>().CreateMapper(sp.GetService));
return new MapperAccessor
{
Mapper = new Mapper(mapperConfiguration)
};
}
context.Services.AddTransient<MapperAccessor>(sp => new MapperAccessor()
{
Mapper = sp.GetRequiredService<IMapper>()
});
context.Services.AddTransient<IMapperAccessor>(provider => provider.GetRequiredService<MapperAccessor>());
}
}

1
framework/src/Volo.Abp.AutoMapper/Volo/Abp/AutoMapper/AutoMapperAutoObjectMappingProvider.cs

@ -1,5 +1,4 @@
using Volo.Abp.ObjectMapping;
namespace Volo.Abp.AutoMapper;
public class AutoMapperAutoObjectMappingProvider<TContext> : AutoMapperAutoObjectMappingProvider, IAutoObjectMappingProvider<TContext>

2
framework/src/Volo.Abp.AutoMapper/Volo/Abp/AutoMapper/MapperAccessor.cs

@ -1,4 +1,4 @@
using AutoMapper;
using AutoMapper;
namespace Volo.Abp.AutoMapper;

5
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<Auto
{
Name = nameof(SourceModel)
};
_objectMapper.Map<SourceModel, DestModel>(source).Name.ShouldBe(nameof(CustomMappingAction));
}
@ -33,6 +35,9 @@ public class AutoMapper_CustomServiceConstruction_Tests : AbpIntegratedTest<Auto
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
// Replace the build-in IMapper with a custom one to use ConstructServicesUsing.
context.Services.Replace(ServiceDescriptor.Transient<IMapper>(sp => sp.GetRequiredService<IConfigurationProvider>().CreateMapper()));
Configure<AbpAutoMapperOptions>(options =>
{
options.AddMaps<TestModule>();

27
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<AutoMapperTestModule>
{
private readonly IObjectMapper _objectMapper;
public AutoMapper_Dependency_Injection_Tests()
{
_objectMapper = GetRequiredService<IObjectMapper>();
}
[Fact]
public void Should_Registered_AutoMapper_Service()
{
@ -30,7 +25,12 @@ public class AutoMapper_Dependency_Injection_Tests : AbpIntegratedTest<AutoMappe
Name = "Source"
};
_objectMapper.Map<SourceModel, DestModel>(sourceModel).Name.ShouldBe(nameof(CustomMappingActionService));
using (var scope = ServiceProvider.CreateScope())
{
scope.ServiceProvider.GetRequiredService<IObjectMapper>().Map<SourceModel, DestModel>(sourceModel).Name.ShouldBe(nameof(CustomMappingActionService));
}
CustomMappingAction.IsDisposed.ShouldBeTrue();
}
public class SourceModel
@ -51,8 +51,10 @@ public class AutoMapper_Dependency_Injection_Tests : AbpIntegratedTest<AutoMappe
}
}
public class CustomMappingAction : IMappingAction<SourceModel, DestModel>
public class CustomMappingAction : IMappingAction<SourceModel, DestModel>, 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<AutoMappe
{
destination.Name = _customMappingActionService.GetName();
}
public void Dispose()
{
IsDisposed = true;
}
}
public class CustomMappingActionService : ITransientDependency

Loading…
Cancel
Save