Browse Source

Fix MapperAccessor problem.

pull/6868/head
maliming 6 years ago
parent
commit
b6cb2860e3
  1. 15
      framework/src/Volo.Abp.AutoMapper/Volo/Abp/AutoMapper/AbpAutoMapperModule.cs
  2. 111
      framework/test/Volo.Abp.AutoMapper.Tests/Volo/Abp/AutoMapper/AutoMapper_Dependency_Injection_Tests.cs
  3. 87
      framework/test/Volo.Abp.AutoMapper.Tests/Volo/Abp/AutoMapper/AutoMapper_MapperAction_Tests.cs

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

@ -25,12 +25,11 @@ namespace Volo.Abp.AutoMapper
{
context.Services.AddAutoMapperObjectMapper();
var mapperAccessor = new MapperAccessor();
context.Services.AddSingleton(_ => mapperAccessor);
context.Services.Add(new ServiceDescriptor(typeof(IMapperAccessor), CreateMappings, ServiceLifetime.Singleton));
context.Services.AddSingleton<MapperAccessor>(provider => CreateMappings(provider));
context.Services.AddSingleton<IMapperAccessor>(provider => provider.GetRequiredService<MapperAccessor>());
}
private IMapperAccessor CreateMappings(IServiceProvider serviceProvider)
private MapperAccessor CreateMappings(IServiceProvider serviceProvider)
{
using (var scope = serviceProvider.CreateScope())
{
@ -59,10 +58,10 @@ namespace Volo.Abp.AutoMapper
ValidateAll(mapperConfiguration);
var mapperAccessor = scope.ServiceProvider.GetRequiredService<MapperAccessor>();
mapperAccessor.Mapper = new Mapper(mapperConfiguration, serviceProvider.GetService);
return mapperAccessor;
return new MapperAccessor
{
Mapper = new Mapper(mapperConfiguration, serviceProvider.GetService)
};
}
}
}

111
framework/test/Volo.Abp.AutoMapper.Tests/Volo/Abp/AutoMapper/AutoMapper_Dependency_Injection_Tests.cs

@ -0,0 +1,111 @@
using AutoMapper;
using Shouldly;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Testing;
using Xunit;
using IObjectMapper = Volo.Abp.ObjectMapping.IObjectMapper;
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()
{
GetService<IValueResolver<string, string, string>>().ShouldBeNull();
GetService<IMemberValueResolver<string, string, string, string>>().ShouldBeNull();
GetService<ITypeConverter<string, string>>().ShouldBeNull();
GetService<IValueConverter<string, string>>().ShouldBeNull();
GetService<IMappingAction<string, string>>().ShouldBeNull();
}
[Fact]
public void Custom_MappingAction_Test()
{
var sourceModel = new SourceModel
{
Name = "Source"
};
_objectMapper.Map<SourceModel, DestModel>(sourceModel).Name.ShouldBe(GetRequiredService<TestNameService>().Name);
}
public class SourceModel
{
public string Name { get; set; }
}
public class DestModel
{
public string Name { get; set; }
}
public class TestService :
IValueResolver<string, string, string>,
IMemberValueResolver<string, string, string, string>,
ITypeConverter<string, string>,
IValueConverter<string, string>,
IMappingAction<string, string>
{
public string Resolve(string source, string destination, string destMember, ResolutionContext context)
{
return source;
}
public string Resolve(string source, string destination, string sourceMember, string destMember, ResolutionContext context)
{
return source;
}
public string Convert(string source, string destination, ResolutionContext context)
{
return source;
}
public string Convert(string sourceMember, ResolutionContext context)
{
return sourceMember;
}
public void Process(string source, string destination, ResolutionContext context)
{
}
}
public class MapperActionProfile : Profile
{
public MapperActionProfile()
{
CreateMap<SourceModel, DestModel>().AfterMap<CustomMappingAction>();
}
}
public class CustomMappingAction : IMappingAction<SourceModel, DestModel>
{
private readonly TestNameService _testNameService;
public CustomMappingAction(TestNameService testNameService)
{
_testNameService = testNameService;
}
public void Process(SourceModel source, DestModel destination, ResolutionContext context)
{
destination.Name = _testNameService.Name;
}
}
public class TestNameService : ITransientDependency
{
public string Name => nameof(TestNameService);
}
}
}

87
framework/test/Volo.Abp.AutoMapper.Tests/Volo/Abp/AutoMapper/AutoMapper_MapperAction_Tests.cs

@ -1,87 +0,0 @@
using AutoMapper;
using Microsoft.Extensions.DependencyInjection;
using Shouldly;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Testing;
using Xunit;
using IObjectMapper = Volo.Abp.ObjectMapping.IObjectMapper;
namespace Volo.Abp.AutoMapper
{
public class AutoMapper_MapperAction_Tests : AbpIntegratedTest<AutoMapperTestModule>
{
private readonly IObjectMapper _objectMapper;
public AutoMapper_MapperAction_Tests()
{
_objectMapper = ServiceProvider.GetRequiredService<IObjectMapper>();
}
[Fact]
public void Should_Name_DIMappingAction()
{
var mapperActionEntity = new MapperActionModel {Name = "MapperActionEntity"};
_objectMapper.Map<MapperActionModel, MapperActionModel2>(mapperActionEntity)
.Name.ShouldBe(nameof(DIMappingAction));
}
[Fact]
public void Should_Name_NotDIMappingAction()
{
var mapperActionEntity = new MapperActionModel2 {Name = "MapperActionEntity"};
_objectMapper.Map<MapperActionModel2, MapperActionModel>(mapperActionEntity)
.Name.ShouldBe(nameof(NotDIMapperAction));
}
public class MapperActionModel
{
public string Name { get; set; }
}
public class MapperActionModel2
{
public string Name { get; set; }
}
public class MapperActionProfile : Profile
{
public MapperActionProfile()
{
CreateMap<MapperActionModel, MapperActionModel2>().AfterMap<DIMappingAction>();
CreateMap<MapperActionModel2, MapperActionModel>().AfterMap<NotDIMapperAction>();
}
}
public class DIMappingAction : IMappingAction<MapperActionModel, MapperActionModel2>
{
private readonly MapperActionService _mapperActionService;
public DIMappingAction(MapperActionService mapperActionService)
{
_mapperActionService = mapperActionService;
}
public void Process(MapperActionModel source, MapperActionModel2 destination, ResolutionContext context)
{
destination.Name = _mapperActionService.GetName();
}
}
public class NotDIMapperAction : IMappingAction<MapperActionModel2, MapperActionModel>
{
public void Process(MapperActionModel2 source, MapperActionModel destination,
ResolutionContext context)
{
destination.Name = nameof(NotDIMapperAction);
}
}
public class MapperActionService : ITransientDependency
{
public string GetName()
{
return nameof(DIMappingAction);
}
}
}
}
Loading…
Cancel
Save