.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-Views之使用视图渲染模板(五)
render(<request>,<template_name>,context=-None,content_type=None,status=None,using=None) ...
- WORKGROUP无法访问,您可能没有权限使用网络资源,请与这台服务器的管理员联系以....
解决方法 1.启用Guest账号 在很多情况下,为了本机系统的安全,Guest账户是被禁用的,这样就无法访问该机器的共享资源,因此必须启用Guest账户. 笔者以Windows XP系统为例进行介绍. ...
- 设计模式C++描述----17.备忘录(Memento)模式
一. 备忘录模式 定义:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态. 结构图: 使用范围: Memento 模式比较适用于功能 ...
- 设计模式C++描述----11.组合(Composite)模式
一. 举例 这个例子是书上的,假设有一个公司的组结结构如下: 它的结构很像一棵树,其中人力资源部和财务部是没有子结点的,具体公司才有子结点. 而且最关健的是,它的每一层结构很相似. 代码实现如下: / ...
- Python 用科学的方法判断函数/方法
from types import MethodType,FunctionType def check(arg): """ 检查arg是方法还是函数? :param ar ...
- 第二十六章 system v消息队列(二)
msgsnd int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg); 作用: 把一条消息添加到消息队列中 参数: msqi ...
- 程序员学点xx 之 Redis
程序员学点xx 之 Redis 概述 其实程序员也要和操作系统打交道, 比如最常见的,部署自己电脑上的开发环境. 当然有时某些牛人, 觉得运维或基础部门的同事不够给力, 亲自上手部署服务器或线上环境, ...
- 品优购(IDEA版)-第二天
品优购-第2天 学习目标 目标1:运用AngularJS前端框架的常用指令 目标2:完成品牌管理的列表功能 目标3:完成品牌管理的分页列表功能 目标4:完成品牌管理的增加功能 目标5:完成品牌管理的修 ...
- PHP判断数组下标有没有存在的方法
PHP判断数组下标有没有存在的方法<pre>if(!empty($token['errcode'])){ print_r($token['errmsg']); exit();}</p ...
- 使用客户机和主机做DNS服务正向解析及小问题解决
1.下载yum包 命令:yum install bind-chroot 2.更改配置文件 在这里,要了解到主配置文件为: /etc/named.conf 但是,为了避免经常修改主配置文件named ...