对象自动映射工具是用来解决对象之间映射转换的类库,能很好地解决DTO和Model之间的相互映射赋值问题。
- 只要两个对象的属性具有相同名字(或者符合它规定的命名约定),对象自动映射工具就可以替我们自动在两个对象间进行属性值的映射。
========== 原创作品 作者:未闻 出处:博客园·布道阁 ==========
一、知识点
1. 为什么需要自动化对象映射?
因为项目开发经常遇到的两大核心问题:如何提高效率、如何提升质量。
2. 它可以做什么?
通过快速实现类对象间的映射(主要解决DTO与模型间的赋值转换)问题,减少编码,从而提高开发效率。
3. 主流技术方案
二、具体实现(选取最丰富的AutoMapper、最精简的TinyMapper作为示例)
1. AutoMapper
- 下载Nuget包
- AutoMapper是基于约定映射的,因此在应用之前需要先调用绑定
-
Mapper.Initialize(cfg => { cfg.CreateMap<Source, Destination>(); });
- AutoMapper提供两种静态方法可以进行对象映射
-
// 新建映射对象 var dest = Mapper.Map<Destination>(src); //为已存在的对象赋值: Mapper.Map(src, dest);
- AutoMapper提供自定义的映射方式
-
cfg.CreateMap<Source, Destination>() .ForMember(dest => dest.PropertyDest, opt => opt.MapFrom(src => src.PropertySrc));
2. TinyMapper
- 下载Nuget包
- TinyMapper基于约定映射,因此在应用之前需要先调用绑定
-
TinyMapper.Bind<Source, Destination>();
- TinyMapper提供两种静态方法可以进行对象映射
-
//新建映射对象: var dest = TinyMapper.Map<Destination>(src); //为已存在的对象赋值: TinyMapper.Map(src, dest);
- TinyMapper提供自定义的映射方式
-
TinyMapper.Bind<Source, Destination>(cfg => { cfg.Ignore(src => src.Property); cfg.Bind(src => src.PropertySrc, dest => dest.PropertyDest); });
3. 用法比较
* Add方法
* Edit方法
* Get方法
4. 性能对比
AutoMapper | TinyMapper | ||
组件版本 | 9.0.0 | 3.0.2-beta | |
组件大小 | 268KB | 53KB | |
最后更新时间 | 2019.08.12 | 2018.06.07 | |
使用方式 | 静态方法、依赖注入 | 静态方法 | |
自定义映射 | 支持、功能强大、灵活 | 支持 | |
列表对象映射 | 支持 | 支持,需额外映射 | |
性能(ms) | Add | 32.75 | 2.34 |
Edit | 19.93 | 1.63 | |
Get | 10.62 | 1.13 | |
Pager(100) | 103.54 | 146.22 | |
Pager(5000) | 233.18 | 147.94 |
三、总结
1. 通过上面的示例可以看到,使用自动化对象映射工具,比手工映射的代码量要少非常多,对系统开发而言,减少的工作量是非常可观的,可以大大加快开发效率。
2. 性能上,手工映射 > TinyMapper > AutoMapper,所以在局部复杂的映射上可以采用手工映射。
四、参考资料