怎样建立网站视频教程,虚拟主机是什么,什么是网络营销策划书,广告logo图片大全我之前文章提到过 MediatR 的作者 Jimmy Bogard#xff0c;他也是大名鼎鼎的对象映射框架 AutoMapper 的作者。AutoMapper 的功能强大#xff0c;在 .NET 领域的开发者中有非常高的知名度和使用率。而今天老衣要提的是另外一款高性能对象映射框架#xff1a;Mapster——它轻… 我之前文章提到过 MediatR 的作者 Jimmy Bogard他也是大名鼎鼎的对象映射框架 AutoMapper 的作者。AutoMapper 的功能强大在 .NET 领域的开发者中有非常高的知名度和使用率。而今天老衣要提的是另外一款高性能对象映射框架Mapster——它轻巧便捷功能也非常强大关键是性能很高——有可能是.NET领域性能最好的。我们先来看看性能与 AutoMapper 相比Mapster 在速度和内存占用方面表现更加优秀 下面是官方给出的稍早版本 6.0 的性能对比表MethodMeanStdDevErrorGen 0Gen 1Gen 2AllocatedMapster 6.0.0108.59 ms1.198 ms1.811 ms31000.0000--124.36 MBMapster 6.0.0 (Roslyn)38.45 ms0.494 ms0.830 ms31142.8571--124.36 MBMapster 6.0.0 (FEC)37.03 ms0.281 ms0.472 ms29642.8571--118.26 MBMapster 6.0.0 (Codegen)34.16 ms0.209 ms0.316 ms31133.3333--124.36 MBExpressMapper 1.9.1205.78 ms5.357 ms8.098 ms59000.0000--236.51 MBAutoMapper 10.0.0420.97 ms23.266 ms35.174 ms87000.0000--350.95 MB从表中我们可以看出即使在不使用高性能组件的情况下它的性能都可以获得4倍于AutoMapper却只需要1/3左右的内存占用而在使用Roslyn Compiler、FEC (FastExpressionCompiler)、Code generation等组件后可以再进一步提升2-3倍的性能。Code generation 方式几乎就是这个事儿极限了。你还有更快的手段吗在实际项目中的基本使用首先从 Nuget 中引用最新版本的 Mapster 包dotnet add package Mapster对象映射最多的场景就是两个实体定义的属性名是重叠对应的那么此时的基本用法就非常简单var destObject sourceObject.AdaptDestination();「注意」我说的是实体定义没有只限制类定义。Class、Record有点小限制注意查阅官方文档、Interface 等各种形式都可以哦这是我非常喜欢的。当然了你的源是IQueryable的也可以不是类也不是接口只是基本的简单类型是否可以呢也可以var s 123.Adaptstring(); // 等同于: 123.ToString();列表、数组、集合、包括各种接口的字典之间的映射也可以: IListT, ICollectionT, IEnumerableT, ISetT, IDictionaryTKey, TValue 等等都可以只要C#支持类型转换的类型那么在 Mapster 中也同样支持转换而且像枚举与字符串之间的转换.NET 自带的方式性能稍慢Mapster也针对性的做了优化所以你实际生产中绝大部分就是类似上面这么一行代码就行了够简单便捷吧 D在某些情况下需要依赖注入Mapster 提供了 IMapper 和 Mapper 来满足这个需求var result mapper.MapTDestination(source);映射配置现实项目中难免会有一些自定义映射的需求Mapster提供了很强大的映射配置机制可以通过映射配置解决你各种灵活需求。我们可以使用 TypeAdapterConfigTSource, TDestination.NewConfig() 或 TypeAdapterConfigTSource, TDestination.ForType() 配置类型映射「注意」当调用 NewConfig 方法时将会覆盖已存在的类型映射配置。TypeAdapterConfigTSource, 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 #334Upgrade packages by SergerGood in #333Include .NET 6.0 as Target Framework for Mapster.Tool by kaizen365 in #390Updated Sample Code in Readme by CoSJay in #379Simplify packaging and publishing NuGet packages, remove old framework monikers and upgrade to C# 10.0 by andrerav in #405Add ability to compile all mappings and then throw AggregateException by MisterOzzy in #363Init 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 看热心网友做到中文翻译版。