.NET自动化对象映射
对象自动映射工具是用来解决对象之间映射转换的类库,能很好地解决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,所以在局部复杂的映射上可以采用手工映射。
四、参考资料
.NET自动化对象映射的更多相关文章
- Python与数据库[2] -> 关系对象映射/ORM[0] -> ORM 与 sqlalchemy 模块
ORM 与 sqlalchemy 1 关于ORM / About ORM 1.1 ORM定义 / Definition of ORM ORM(Object Relational Mapping),即对 ...
- .NET平台开源项目速览(14)最快的对象映射组件Tiny Mapper
好久没有写文章,工作甚忙,但每日还是关注.NET领域的开源项目.五一休息,放松了一下之后,今天就给大家介绍一个轻量级的对象映射工具Tiny Mapper:号称是.NET平台最快的对象映射组件.那就一起 ...
- 对象映射工具AutoMapper介绍
AutoMapper是用来解决对象之间映射转换的类库.对于我们开发人员来说,写对象之间互相转换的代码是一件极其浪费生命的事情,AutoMapper能够帮助我们节省不少时间. 一. AutoMapper ...
- EF架构~AutoMapper对象映射工具简化了实体赋值的过程
回到目录 AutoMapper是一个.NET的对象映射工具,一般地,我们进行面向服务的开发时,都会涉及到DTO的概念,即数据传输对象,而为了减少系统的负载,一般我们不会把整个表的字段作为传输的数据,而 ...
- MojoDatabase 源码学习之对象映射
Mojo-database是我个人比较喜欢多开源项目,下文是该项目打介绍和地址: mojo-database 简介: MojoDatabase is an ActiveRecord-like ORM ...
- php设计模式 数据对象映射模式
数据对象映射模式,是将对象和数据存储映射起来,对一个对象的操作会映射为对数据存储的操作. 在代码中实现数据对象映射模式,实现一个ORM类,将复杂的sql语句映射成对象属性的操作.对象关系映射(Obje ...
- c#注册表对象映射
用于快捷保存与读取注册表,为对应的对象 示例 [RegistryRoot(Name = "superAcxxxxx")] public class Abc : IRegistry ...
- ASP.NET MVC 模型和数据对象映射实践
在使用 MVC 开发项目的过程中遇到了个问题,就是模型和数据实体之间的如何快捷的转换?是不是可以像 Entity Framework 的那样 EntityTypeConfiguration,或者只需要 ...
- PHP 设计模式 笔记与总结(10)数据对象映射模式 2
[例2]数据对象映射模式结合[工厂模式]和[注册模式]的使用. 入口文件 index.php: <?php define('BASEDIR',__DIR__); //定义根目录常量 includ ...
随机推荐
- vue订阅者模式
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- split分割文件与数据
split主要用途:在之前计算机发展的时候,我们必须分割文件,才能将大量数据放入多张软盘中,而今我们分割文件有了其他的目的,比如提高可读性,生成日志以及发送有大小限制的E-mail附件. 工作原理:s ...
- vue引入css文件报错Unrecognised input
一个vue项目中用到了swiper插件,引入swiper.css时报错 显示引入的css文件Unrecognised input ,在文件的line4,column12 . 其实是引入位置不对,样式文 ...
- vw vh 的概念
视口单位(Viewport units) 什么是视口? 在桌面端,视口指的是在桌面端,指的是浏览器的可视区域:而在移动端,它涉及3个视口:Layout Viewport(布局视口),Visual Vi ...
- SpringBoot系列:Spring Boot异步调用@Async
在实际开发中,有时候为了及时处理请求和进行响应,我们可能会多任务同时执行,或者先处理主任务,也就是异步调用,异步调用的实现有很多,例如多线程.定时任务.消息队列等, 这一章节,我们就来讲讲@Async ...
- vue学习笔记(一)入门
前言 随着前端不断的壮大,许多公司对于前端开发者的需求也越来越多了,作为一名优秀的前端工程师,如果连vue和react都不会的话,那真是out了,为什么那么说呢?这是我在招聘网站上截的一张图,十家公司 ...
- [windows篇] 使用Hexo建立个人博客,自定义域名https加密,搜索引擎google,baidu,360收录
为了更好的阅读体验,欢迎阅读原文.原文链接在此. [windows篇] 使用Hexo建立个人博客,自定义域名https加密,搜索引擎google,baidu,360收录 Part 2: Using G ...
- Redis的使用--基本数据类型的操作命令和应用场景
echo编辑整理,欢迎转载,转载请声明文章来源.欢迎添加echo微信(微信号:t2421499075)交流学习. 百战不败,依不自称常胜,百败不颓,依能奋力前行.--这才是真正的堪称强大!!! Red ...
- Unity3-各个内置面板,对象说明
*在Inspector面板中,是表示每个物体(诸如摄像机,圆柱,正方体)的组件. 组件包含: 1.Transform,在第一节当中,可以用于变换物体的位置.每个物体对象都有. 2.cube,网格,对于 ...
- oop面向对象知识总结 静态成员和友元
第十一章 静态成员和友元 11.1 静态成员 1.C++类当中的静态数据成员仍借用保留字static,但是与之前的静态全局变量,静态局部变量以及静态函数没有关系. 2.静态数据成员不占用具体对象的数据 ...