.Net Core使用AutoMapper做对象关系映射
我想很多后端开发者,纠结于如何在Dto及表实体中做属性关系映射,因为真的太繁琐了。,
⒈如何使用?
1 Mapper.Initialize(cfg => cfg.CreateMap<UsersInputDto, Users>()); 2 UsersInputDto input = new UsersInputDto() 3 { 4 id = 1, firstname = "fan", lastname = "qi", uname = "fanqisoft", pwd = "admin", enabled = 1 5 }; 6 Users user = Mapper.Map<Users>(input);
⒉映射前或映射后进行操作
首先附上实体类
1 using System; 2 using System.Collections.Generic; 3 using System.Text; 4 5 namespace AutoMapperTest.Entities 6 { 7 public class Users 8 { 9 public int id { get; set; } 10 public string fullname { get; set; } 11 public int? age { get; set; } 12 public string username { get; set; } 13 14 public string password { get; set; } 15 public int? enabled { get; set; } 16 17 public override string ToString() 18 { 19 return $"用户ID:{this.id} \n用户姓名:{this.fullname}\n用户名:{this.username} \n用户密码:{this.password} \n用户是否启用:{(this.enabled==1?'是':'否')}"; 20 } 21 } 22 }
InputDto
1 using System; 2 using System.Collections.Generic; 3 using System.Text; 4 5 namespace AutoMapperTest.Entities 6 { 7 public class UsersInputDto 8 { 9 public int id { get; set; } 10 public string firstname { get; set; } 11 public string lastname { get; set; } 12 public int? age { get; set; } 13 public string uname { get; set; } 14 15 public string pwd { get; set; } 16 public int? enabled { get; set; } 17 } 18 }
当前端InputDto传到后端时,我需要将Dto中的firstname及lastname合并转换为数据表中的fullname
1 Mapper.Initialize(cfg => 2 { 3 cfg.CreateMap<UsersInputDto, Users>().BeforeMap((dto, ent) => ent.fullname = dto.firstname + "_" + dto.lastname); 4 });
⒊条件映射,必须必要的条件后才会映射属性。
1 Mapper.Initialize(cfg => 2 { 3 cfg.CreateMap<UsersInputDto, Users>().ForMember(d => d.age, u => u.Condition(s => s.age >= 0 && s.age <= 120)); 4 });
⒋属性对应映射,Dto中属性名 != 数据表属性名
1 Mapper.Initialize(cfg => 2 { 3 cfg.CreateMap<UsersInputDto, Users>().ForMember(d => d.username, u => u.MapFrom(s => s.uname)) 4 .ForMember(d => d.password, u => u.MapFrom(s => s.pwd)); 5 });
⒌使用配置文件?实现Profile类并在构造器中初始化你的配置。
1 using AutoMapper; 2 using AutoMapperTest.Entities; 3 using System; 4 using System.Collections.Generic; 5 using System.Text; 6 7 namespace AutoMapperTest.AutoMapper 8 { 9 public class AutoMapperConfig:Profile 10 { 11 public AutoMapperConfig() 12 { 13 CreateMap<UsersInputDto, Users>(); 14 } 15 } 16 }
1 Mapper.Initialize(cfg => 2 { 3 cfg.CreateMap<UsersInputDto, Users>().ForMember(d => d.username, u => u.MapFrom(s => s.uname)) 4 .ForMember(d => d.password, u => u.MapFrom(s => s.pwd)); 5 cfg.AddProfile<AutoMapperConfig>(); //添加一个配置文件 6 });
⒍Dto中数据类型和数据表不一致那就自定义转换器吧。
1 using AutoMapper; 2 using AutoMapperTest.Entities; 3 using System; 4 using System.Collections.Generic; 5 using System.Text; 6 7 namespace AutoMapperTest.AutoMapper 8 { 9 public class UsersConverter:ITypeConverter<Users,UsersOutputDto> 10 { 11 public UsersOutputDto Convert(Users source, UsersOutputDto destination, ResolutionContext context) 12 { 13 string[] names = source.fullname.Split("_"); 14 return new UsersOutputDto() 15 { 16 id = source.id, 17 firstname = names[0], 18 lastname = names[1] 19 }; 20 } 21 } 22 }
1 Mapper.Initialize(cfg => 2 { 3 cfg.CreateMap<Users, UsersOutputDto>().ConvertUsing<UsersConverter>(); 4 }); 5 Users users = new Users() 6 { 7 id = 1, fullname = "fan_qi",age = 25,username = "fanqisoft",password ="admin",enabled = 1 8 }; 9 UsersOutputDto output = Mapper.Map<UsersOutputDto>(users);
⒎附一个可用的静态工具类
1 using AutoMapper; 2 using System; 3 using System.Collections; 4 using System.Collections.Generic; 5 using System.Data; 6 using System.Text; 7 8 namespace AutoMapperTest.AutoMapper 9 { 10 /// <summary> 11 /// AutoMapper扩展帮助类 12 /// </summary> 13 public static class AutoMapperHelper 14 { 15 /// <summary> 16 /// 类型映射 17 /// </summary> 18 /// <typeparam name="T"></typeparam> 19 /// <param name="obj"></param> 20 /// <returns></returns> 21 public static T MapTo<T>(this object obj) 22 { 23 if(obj == null) 24 { 25 return default(T); 26 } 27 Mapper.Initialize(cfg => 28 { 29 cfg.CreateMap(obj.GetType(), typeof(T)); 30 }); 31 return Mapper.Map<T>(obj); 32 } 33 34 /// <summary> 35 /// 集合列表类型映射 36 /// </summary> 37 public static List<TDestination> MapToList<TDestination>(this IEnumerable source) 38 { 39 foreach (var first in source) 40 { 41 var type = first.GetType(); 42 Mapper.Initialize(cfg => 43 { 44 cfg.CreateMap(type, typeof(TDestination)); 45 }); 46 break; 47 } 48 return Mapper.Map<List<TDestination>>(source); 49 } 50 /// <summary> 51 /// 集合列表类型映射 52 /// </summary> 53 public static List<TDestination> MapToList<TSource, TDestination>(this IEnumerable<TSource> source) 54 { 55 //IEnumerable<T> 类型需要创建元素的映射 56 Mapper.Initialize(cfg => 57 { 58 cfg.CreateMap<TSource, TDestination>(); 59 }); 60 return Mapper.Map<List<TDestination>>(source); 61 } 62 /// <summary> 63 /// 类型映射 64 /// </summary> 65 public static TDestination MapTo<TSource, TDestination>(this TSource source, TDestination destination) 66 where TSource : class 67 where TDestination : class 68 { 69 if (source == null) return destination; 70 Mapper.Initialize(cfg => 71 { 72 cfg.CreateMap<TSource, TDestination>(); 73 }); 74 return Mapper.Map(source, destination); 75 } 76 /// <summary> 77 /// DataReader映射 78 /// </summary> 79 public static IEnumerable<T> DataReaderMapTo<T>(this IDataReader reader) 80 { 81 Mapper.Reset(); 82 Mapper.Initialize(cfg => 83 { 84 cfg.CreateMap<IDataReader, IEnumerable<T>>(); 85 }); 86 return Mapper.Map<IDataReader, IEnumerable<T>>(reader); 87 } 88 } 89 }