可能是.NET领域性能最好的对象映射框架——Mapster

我之前文章提到过 MediatR 的作者 Jimmy Bogard,他也是大名鼎鼎的对象映射框架 AutoMapper 的作者。AutoMapper 的功能强大,在 .NET 领域的开发者中有非常高的知名度和使用率。而今天老衣要提的是另外一款高性能对象映射框架:Mapster——它轻巧便捷,功能也非常强大,关键是性能很高——有可能是.NET领域性能最好的。

我们先来看看性能

与 AutoMapper 相比,Mapster 在速度和内存占用方面表现更加优秀 ,下面是官方给出的稍早版本 6.0 的性能对比表:

MethodMeanStdDevErrorGen 0Gen 1Gen 2Allocated
'Mapster 6.0.0'108.59 ms1.198 ms1.811 ms31000.0000--124.36 MB
'Mapster 6.0.0 (Roslyn)'38.45 ms0.494 ms0.830 ms31142.8571--124.36 MB
'Mapster 6.0.0 (FEC)'37.03 ms0.281 ms0.472 ms29642.8571--118.26 MB
'Mapster 6.0.0 (Codegen)'34.16 ms0.209 ms0.316 ms31133.3333--124.36 MB
'ExpressMapper 1.9.1'205.78 ms5.357 ms8.098 ms59000.0000--236.51 MB
'AutoMapper 10.0.0'420.97 ms23.266 ms35.174 ms87000.0000--350.95 MB

从表中我们可以看出,即使在不使用高性能组件的情况下它的性能都可以获得4倍于AutoMapper,却只需要1/3左右的内存占用,而在使用Roslyn CompilerFEC (FastExpressionCompiler)Code generation等组件后可以再进一步提升2-3倍的性能。Code generation 方式几乎就是这个事儿极限了。你还有更快的手段吗?

在实际项目中的基本使用

首先从 Nuget 中引用最新版本的 Mapster 包:

dotnet add package Mapster

对象映射最多的场景就是两个实体定义的属性名是重叠对应的,那么此时的基本用法就非常简单:

var destObject = sourceObject.Adapt<Destination>();

「注意」我说的是实体定义,没有只限制类定义。Class、Record(有点小限制注意查阅官方文档)、Interface 等各种形式都可以哦,这是我非常喜欢的。当然了你的源是IQueryable的也可以!

不是类也不是接口,只是基本的简单类型是否可以呢?也可以!

var s = 123.Adapt<string>(); // 等同于: 123.ToString();

列表、数组、集合、包括各种接口的字典之间的映射,也可以: IList<T>, ICollection<T>, IEnumerable<T>, ISet<T>, IDictionary<TKey, TValue> 等等都可以!

只要C#支持类型转换的类型,那么在 Mapster 中也同样支持转换,而且像枚举与字符串之间的转换,.NET 自带的方式性能稍慢,Mapster也针对性的做了优化,所以你实际生产中绝大部分就是类似上面这么一行代码就行了,够简单便捷吧 :D

在某些情况下,需要依赖注入,Mapster 提供了 IMapperMapper 来满足这个需求:

var result = mapper.Map<TDestination>(source);

映射配置

现实项目中难免会有一些自定义映射的需求,Mapster提供了很强大的映射配置机制,可以通过映射配置解决你各种灵活需求。

我们可以使用 TypeAdapterConfig<TSource, TDestination>.NewConfig()TypeAdapterConfig<TSource, TDestination>.ForType() 配置类型映射;

「注意」当调用 NewConfig 方法时,将会覆盖已存在的类型映射配置。

TypeAdapterConfig<TSource, TDestination>.NewConfig().Ignore(dest => dest.Age).Map(dest => dest.FullName,src => string.Format("{0} {1}", src.FirstName, src.LastName));

当然了你想让自己配置全局有效,可以通过对 TypeAdapterConfig.GlobalSettings 进行设置处理。

你有一些场景需要有条件规则?没问题,可以通过When方法来实现:

TypeAdapterConfig.GlobalSettings.When((srcType, destType, mapType) => srcType == destType).Ignore("Id");

上面这个配置的意思是,应用全局范围当任何一个映射的源类型和目标类型相同时,不映射 Id 属性。

新版本中对接口只读属性映射的增强

最近刚刚发布对 Mapster 7.3.0 带来了一些新的增强:

  • Switch expression by @SergerGood in #334

  • Upgrade packages by @SergerGood in #333

  • Include .NET 6.0 as Target Framework for Mapster.Tool by @kaizen365 in #390

  • Updated Sample Code in Readme by @CoSJay in #379

  • Simplify packaging and publishing NuGet packages, remove old framework monikers and upgrade to C# 10.0 by @andrerav in #405

  • Add ability to compile all mappings and then throw AggregateException by @MisterOzzy in #363

  • Init read-only properties when mapping with a non-readonly interface fixes #374 by @andrei-traktatovich in #375

其中最后一下对接口的只读属性映射增强,是我非常喜欢的,解决了在实际项目中的设计需求,省了不少事儿。

public interface ITarget
{int GetOnlyProperty {get;}int NormalProperty {get;set;}
}
public interface ITargetWithGetSetProperties
{int GetOnlyProperty {get;}int NormalProperty {get;set;}
}

上面这个代码中场景中,如果ITarget类型的对象的属性 GetOnlyProperty 带有一个非 0 值,并想 Map 为 ITargetWithGetSetProperties 类型的对象时,老版本会在映射后目标对象的GetOnlyProperty保留int类型的默认值0,没做任何映射,新版本中解决了这个问题!

你可能会问“为什么会有这个需求?”,嗯,一个原因是因为接口可以多继承,而类只能单一继承,你品品,细品…… :D

其他

微信公众号文章不适合详细展开讨论和分享,本文主要是抛砖引玉。想详细了解这个框架的可以到官方代码库中去看一下 https://github.com/MapsterMapper/Mapster ,如果说英文阅读有点困难,可以到 https://github.com/rivenfx/Mapster-docs 看热心网友做到中文翻译版。

00a8f65e79e42ddec154cad3af6dc701.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/290868.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android studio之Unknown run configuration type AndroidRunConfigurationType解决办法

1、问题 我也就是只是一开始点击了File->invalidate cachas / restart -> invalidate and restart 在Android studio里面运行之前正常的安卓项目&#xff0c;报下错误Unknown run configuration type AndroidRunConfigurationTyp 2、解决办法 原因&#xff1a;是因为插件…

Delphi XE5实现减少编译出来的程序体积

本文章介绍了Delphi XE5实现减少编译出来的程序体积&#xff0c;一般情况下&#xff0c;编译出来的文件会比较大&#xff0c;对于发布来说&#xff0c;比较不方便&#xff0c;经过查询&#xff0c;找到了两个减少体积的办法1&#xff1a;关闭DEBUG信息&#xff0c;通过下面的步…

超级计算机适用于科学计算,中国科学院

中科院合肥物质科学研究院物质科学计算中心超算用户使用规章为加强物质科学计算中心(中科院超级计算环境合肥分中心)的运行管理&#xff0c;合理和科学地使用超算资源&#xff0c;发挥超算平台在科研工作中的作用&#xff0c;特制订此规章。1. 用户应自觉遵守国家的各项法律规定…

[cocos2d]修改富文本文本和高度

1.local richTable { {text , color cc.c3b(173,118,15)}, {custom , color ItemMacro[index].color, param id} } 2.item:setContentSize(50,20)转载于:https://www.cnblogs.com/Faiz-room/p/6727072.html

CodeForces 546B

题目链接&#xff1a;http://acm.hust.edu.cn/vjudge/contest/view.action?cid82659#problem/C 解题思路&#xff1a;先对输入的数据放入a数组里面存储&#xff0c;再将a数组用sort进行排序&#xff0c;从第二个数开始判断&#xff0c;是否比第一个大&#xff0c;如果大&#…

Avalonia跨平台入门第一篇

作为一枚屌丝程序员来说最大的爱好就是撸代码,有时候根本停不下来(沉迷工作,无法自拔);因为一直都是WPF开发,后面也摸索了一下Xamarin的东西;这不又看到其他人又在搞什么跨平台;我也是手也很痒痒;就像刚开始摸索Xamarin一样,想又不知如何下手;这不再次迈出了第一步去摸索Avalon…

linux之用route命令看简单路由信息

1、我们在linux上简单看路由信息使用下面命令 route -n

三角形带优化库nvtrisrip的使用

nvtrisrip是NVIDIA提供的一个开源优化库&#xff0c;这个库可以将三角形顶点索引数组转换为三角形带索引数组。可以极大的提高渲染速度。NVIDIA这个库的官方地址是&#xff1a;http://www.nvidia.com/object/nvtristrip_library.html不过这里代码不全也不够新&#xff0c;推荐从…

angular-ui-tab-scroll

2019独角兽企业重金招聘Python工程师标准>>> A scrollable tab plugin intended for scrolling UI Bootstrap tabset. 功能介绍&#xff1a;http://npm.taobao.org/package/angular-ui-tab-scroll 下载地址&#xff1a;https://github.com/VersifitTechnologies/ang…

调用带有 out 参数的方法时检查弃元参数

前言C# 支持弃元&#xff0c;弃元是应用程序代码中故意未使用的占位符变量。弃元将意图传达给编译器和读取代码的其他人&#xff1a;你打算忽略表达式的结果。通过为变量分配下划线(_)作为其名称&#xff0c;可以指示变量是弃元变量。例如下列代码&#xff1a;if (DateTime.Try…

007-网站的搭建

昨天在极客学院的视频引导下&#xff0c;我成功的模拟量本地建站和利用虚拟主机建站。 我用的虚拟主机是阿里云提供的虚拟主机&#xff0c;域名是从万网购买的&#xff0c;网站模板是wordpress。 先通过虚拟主机把网站搭建好&#xff0c;再买域名&#xff0c;将域名解析到网站上…

潍坊学院计算机系崔玲玲,人工免疫算法在引水工程中的应用.pdf

人工免疫算法在引水工程中的应用.pdf第 14卷第2期 潍坊学院学报 Vo1&#xff0e;14No&#xff0e;22014年 4月 JournalofWeifangUniversity Apr&#xff0e;2014人工免疫算法在引水工程中的应用崔玲玲 &#xff0c;王林叶 &#xff0c;陈志银(1-潍坊学院&#xff0c;山东 潍坊 …

Android之Unable to execute dex: Multiple dex files define 解决方法

1、问题 运行Android项目&#xff0c;出现Unable to execute dex: Multiple dex files define 这个错误 2、原因 代码里面引用的jar包和项目里面的类冲突了&#xff0c;一般比如&#xff0c;我写了这个项目&#xff0c;然后把这个项目打成jar包&#xff0c;然后再导入这个项目…

为什么?

为什么80%的码农都做不了架构师&#xff1f;>>> 为什么总有那么多的难以忘怀&#xff1f;或许这是前世我们欠下的债吧为什么总觉得别人家的好&#xff1f;却忽视了身边最真实的温暖为什么总是固执的坚持着虚幻的前景&#xff1f;因为就算再小的梦想也有实现的权利为…

抽象类和接口类的区别

2019独角兽企业重金招聘Python工程师标准>>> 一、 抽象类abstract class 1 &#xff0e;抽象类是指在 class 前加了 abstract 关键字且存在抽象方法&#xff08;在类方法 function 关键字前加了 abstract 关键字&#xff09;的类。 2 &#xff0e;抽象类不能被直接实…

浅谈C#字符串构建利器StringBuilder

前言在日常的开发中StringBuilder大家肯定都有用过&#xff0c;甚至用的很多。毕竟大家都知道一个不成文的规范&#xff0c;当需要高频的大量的构建字符串的时候StringBuilder的性能是要高于直接对字符串进行拼接的&#xff0c;因为直接使用或都会产生一个新的String实例&#…

高效时间管理

P1 高效时间管理P2课程主要内容时间管理概述高效时间管理策略性的目标设定设定优先顺序规划与组织时间管理工具消除时间杀手高效日程管理如何为领导制定日程表P3昨天是一张已被注销的支票明天是一张尚未到期的支票今天则是随时可运用的现金&#xff0c;请善用它&#xff01;P4高…

南京大学计算机考研面试题目,南京大学计算机考研05-07,09年面试题

(多媒体技术及应用&#xff0c;计算机图形学&#xff0c;中文信息处理等)(张老师的问题基本上在书上都能找到&#xff0c;不过很杂&#xff0c;张老的每一个问题都是由浅入深根据你的回答&#xff0c;一步一步深入下去的一大堆小问题组成的。)2005&#xff1a;1、关于Cache&…

linux之如何在任意目录执行我常用的脚本文件

1、问题 比如我们在ubuntu上开发Android的时候&#xff0c;经常会用到jadx、 pidcat.py ,但是我们希望在任何目录都能执行这些命令&#xff0c; 如果不知道pidcat.py是什么东西的&#xff0c;可以先百度 2、解决方式 1)如果是一个脚本文件&#xff0c;比如pidcat.py这个脚本&…

RTMPdump(libRTMP) 源代码分析 10: 处理各种消息(Message)

2019独角兽企业重金招聘Python工程师标准>>> 注&#xff1a;此前写了一些列的分析RTMPdump&#xff08;libRTMP&#xff09;源代码的文章&#xff0c;在此列一个列表&#xff1a;RTMPdump 源代码分析 1&#xff1a; main()函数RTMPDump&#xff08;libRTMP&#xff…