在ABP中灵活使用AutoMapper
- 2019 年 10 月 3 日
- 筆記
demo???ABP.WindowsService
???????? ??.NetCore?ABP?????Windows????Quartz???? ??????
AutoMapper??
AutoMapper??????????????????????????? – ?????????????????????????????????????????????????AutoMapper?????????????
?????https://automapper.org/
GitHub???https://github.com/AutoMapper/AutoMapper
AutoMapper?????
????????????????????????Abp????????????????AutoMapper?????????????
- ????????????????DTO????Entity?????????????????????????DTO????????????????????????????????????
- DTO?Entity?????????????????????????????
????????????????
public class Order { public string OrderName { get;set; } public string PhoneNumber { get;set; } } public class OrderDto { public string OrderName { get;set; } }
var config = new MapperConfiguration(cfg => cfg.CreateMap<Order, OrderDto>()); var mapper = config.CreateMapper(); OrderDto dto = mapper.Map<OrderDto>(order);
??
var config = new MapperConfiguration(cfg => cfg.CreateMap<Order, OrderDto>()); var mapper = new Mapper(config); OrderDto dto = mapper.Map<OrderDto>(order);
Abp.AutoMapper?????
Abp.AutoMapper??????https://aspnetboilerplate.com/Pages/Documents/Object-To-Object-Mapping
Abp.AutoMapper?Nuget???https://www.nuget.org/packages/Abp.AutoMapper
??nuget?
Install-Package Abp.AutoMapper
??AbpAutoMapperModule??
[DependsOn(typeof(AbpAutoMapperModule))] public class MyJobCoreModule : AbpModule { }
??????
????
???????AutoMap, AutoMapFrom, AutoMapTo??????
??????????
[AutoMapFrom(typeof(Order))] public class OrderDto { public string OrderName { get;set; } }
??
[AutoMapTo(typeof(OrderDto))] public class Order { public string OrderName { get;set; } public string PhoneNumber { get;set; } }
???????????????????????????????????????????????????????
?????
[DependsOn(typeof(AbpAutoMapperModule))] public class MyJobCoreModule : AbpModule { public override void PreInitialize() { Configuration.Modules.AbpAutoMapper().Configurators.Add(config => { config.CreateMap<Order, OrderDto>(); }); } }
????
config.CreateMap<Order, OrderDto>() .ForMember(u => u.PhoneNumber, options => options.Ignore());
??????
OrderDto???????Tel???Order??PhoneNumber
public class OrderDto { public string OrderName { get; set; } public string Tel { get; set; } }
config.CreateMap<Order, OrderDto>() .ForMember(u => u.Tel, options => options.MapFrom(input => input.PhoneNumber));
????????????
?????11???????4?
private static string HideTel(string input) { if (string.IsNullOrEmpty(input)) { return string.Empty; } var outReplace = Regex.Replace(input, "(d{3})d{4}(d{4})", "$1****$2"); return outReplace; }
config.CreateMap<Order, OrderDto>() .ForMember(u => u.Tel, options => options.MapFrom(input => HideTel(input.PhoneNumber)));
????
???OrderDto???????????
namespace Demo.MyJob.Entity.Dto { public class OrderDto { public string OrderName { get; set; } public string Tel { get; set; } public string PostalAddress { get; set; } public string DeliveryAddress { get; set; } } }
Order????OrderAddress????
namespace Demo.MyJob.Entity { public class OrderAddress { public string OrderId { get; set; } public string PostalAddress { get; set; } public string DeliveryAddress { get; set; } } }
?????OrderAddress?Order????????OrderDto???????????Tuple?
config.CreateMap<(Order, OrderAddress), OrderDto>() .ForMember(u => u.Tel, options => options.MapFrom(input => HideTel(input.Item1.PhoneNumber))) .ForMember(u => u.OrderName, options => options.MapFrom(input => input.Item1.OrderName)) .ForMember(u => u.PostalAddress, options => options.MapFrom(input => input.Item2.PostalAddress)) .ForMember(u => u.DeliveryAddress, options => options.MapFrom(input => input.Item2.DeliveryAddress)) ;
????
?????????????????PreInitialize????????????
public override void PreInitialize() { Configuration.Modules.AbpAutoMapper().Configurators.Add(config => { config.CreateMap<(Order, OrderAddress), OrderDto>() .ForMember(u => u.Tel, options => options.MapFrom(input => HideTel(input.Item1.PhoneNumber))) .ForMember(u => u.OrderName, options => options.MapFrom(input => input.Item1.OrderName)) .ForMember(u => u.PostalAddress, options => options.MapFrom(input => input.Item2.PostalAddress)) .ForMember(u => u.DeliveryAddress, options => options.MapFrom(input => input.Item2.DeliveryAddress)) ; }); }
?????????MyMapperProfile???AutoMapper.Profile
using System.Text.RegularExpressions; using AutoMapper; using Demo.MyJob.Entity; using Demo.MyJob.Entity.Dto; namespace Demo.MyJob.MapperProfiles { class MyMapperProfile : Profile { private static string HideTel(string input) { if (string.IsNullOrEmpty(input)) { return string.Empty; } var outReplace = Regex.Replace(input, "(d{3})d{4}(d{4})", "$1****$2"); return outReplace; } public MyMapperProfile() { CreateMap<Order, OrderDto>() .ForMember(u => u.Tel, options => options.MapFrom(input => HideTel(input.PhoneNumber))); CreateMap<(Order, OrderAddress), OrderDto>() .ForMember(u => u.Tel, options => options.MapFrom(input => HideTel(input.Item1.PhoneNumber))) .ForMember(u => u.OrderName, options => options.MapFrom(input => input.Item1.OrderName)) .ForMember(u => u.PostalAddress, options => options.MapFrom(input => input.Item2.PostalAddress)) .ForMember(u => u.DeliveryAddress, options => options.MapFrom(input => input.Item2.DeliveryAddress)) ; } } }
??PreInitialize
[DependsOn(typeof(AbpAutoMapperModule))] public class MyJobCoreModule : AbpModule { public override void PreInitialize() { Configuration.Modules.AbpAutoMapper().Configurators.Add(config => { config.AddMaps(typeof(MyJobCoreModule)); }); } }
Abp.AutoMapper????4.8.0??????
config.AddProfiles(typeof(MyJobCoreModule));
???????Abp???????AutoMapper???????????