.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 ...
随机推荐
- js数组及动态插入节点数据
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- K8s 还是 k3s?This is a question
本文来自:Rancher Labs 自k3s问世以来,社区里有许多小伙伴都问过这样的问题"除了中间的数字之外,k3s和K8s的区别在哪里?","在两者之间应该如何选择?& ...
- Python爬虫常用小技巧之设置代理IP
设置代理IP的原因 我们在使用Python爬虫爬取一个网站时,通常会频繁访问该网站.假如一个网站它会检测某一段时间某个IP的访问次数,如果访问次数过多,它会禁止你的访问.所以你可以设置一些代理服务器来 ...
- 微信小程序的canvas和遮盖布颜色设置问题
canvas绘画出并显示小程序的逻辑首先是将网络图片转化为本地图片,其次再将进行绘画.将本地图片和二维码显示在画布上,最后将整个画布截图用api显示在屏幕上.真正的画图让他飞去屏幕外. 有时候会需要用 ...
- C++学习笔记12_各种文件和引入
1. 编译过程 预处理->编译->汇编->链接->.exe 预处理: ①将所有的“#define”删除,并且展开所有的宏定义 ②处理所有的条件编译指令,如:“#if”.“#if ...
- OpenCV图像处理以及人脸识别
OpenCV基础 OpenCV是一个开源的计算机视觉库.提供了很多图像处理常用的工具 批注:本文所有图片数据都在我的GitHub仓库 读取图片并显示 import numpy as np import ...
- 原生JS实现栈结构
1. 前言 栈,是一种遵从后进先出(LIFO,Later-In-First-Out)原则的有序集合.新添加的元素都保存在栈的一端,称作栈顶,另一端叫做栈底.在栈中,新元素都靠近栈顶,旧元素都靠近栈底. ...
- 2684亿!阿里CTO张建锋:不是任何一朵云都撑得住双11
2019天猫双11 成交额2684亿! "不是任何一朵云都能撑住这个流量.中国有两朵云,一朵是阿里云,一朵叫其他云."11月11日晚,阿里巴巴集团CTO张建锋表示,"阿里 ...
- C++STL整理
STL整理 vector #include<bits/stdc++.h> #define go(i,a,b) for(int i=a;i<b;i++) using namespace ...
- 基本数据类型(While循环,For循环,列表以及相关用法)
正常在没有学习循环情况下,我们要输出同样的语句,需要重复打印.相当重要!!!! While循环 将输出放在一行 end=""默认是换行 print("Hello Worl ...