對象自動映射工具是用來解決對象之間映射轉換的類庫,能很好地解決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,所以在局部複雜的映射上可以採用手工映射。
四、參考資料