.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 ...
随机推荐
- django-个人网站之环境配置(一)
1.建立django项目 django-admin startproject myblog 2.进入myblog目录 建立app存储自己的基本信息 python manage.py startapp ...
- PHP比较IP大小
function cmpLoginIP($a, $b) { return bindec(decbin(ip2long($a['loginIp']))) > bindec(decbin(ip2lo ...
- 设计模式C++描述----19.命令(Command)模式
一. 举例说明 我们知道,在多线程程序中,多个用户都给系统发 Read 和 Write 命令.这里有几点需要说明: 1. 首先明确一点,所有的这些 Read 和 Write 命令都是调用一个库函数. ...
- Emacs 学习之旅
**Emacs 的使用过程,就像是程序员的生涯一样--路漫漫其修远兮,吾将上下而求索.** ## 万物始于 Emacs 最早知道 _Emacs_ 是从编辑器的圣战开始的,即编辑器之神--Vi,和神的编 ...
- swift 手机号、邮箱、网址等正则表达式验证
看到一个不错的swift的 手机号.邮箱.网址等正则表达式验证,分享给大家. 支持swift3,经过修改后,亲测可用! import Foundation enum Validate { case e ...
- SAP SOAMANAGER报错原因与故障排除方法
一些刚刚接触到SAP Webservice的开发者由于对SAP Netweaver组件的不熟悉,往往在使用事物码SOAMANAGER进行webservice配置的时候,发现无法正常启动SOAMANAG ...
- 解决靶机Bee-Box 键盘乱序问题
Bee-Box介绍 Bee-box官方称呼BWAPP,buggy web Application 这是一个集成了各种常见漏洞和最新漏洞的开源Web应用程序,目的是帮助网络安全爱好者.开发人员和学生发现 ...
- Linux服务器更改Apache2默认页面
方式一 获取root权限 su root //或者 sudo -i 进入 /var/www目录下 cd /var/www 创建目录 mkdir -m 777 myhtml // myhtml为自己创建 ...
- 网站搭建 - Linux虚拟系统 - 时间设置 - root密码修改 - 建站
先试一下,如果不成的话,就不发表了. 下载织梦: 额,这个先还是不要下了. Linux是Apache + MySQL + PHP的套路,先下载吧,不摆图了,直接摆命令,我的是虚拟机,可能没有那么顺利. ...
- thinkphp两表,多表联合查询及分页的连贯操作写法
ThinkPHP中关联查询(即多表联合查询)可以使用 table() 方法或和join方法,具体使用如下例所示: 1.原生查询示例: 代码如下: $Model = new Model(); $sql ...