在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?????????????

  1. ????????????????DTO????Entity?????????????????????????DTO????????????????????????????????????
  2. 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???????????