前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >重复造轮子 SimpleMapper (转载非原创)

重复造轮子 SimpleMapper (转载非原创)

作者头像
wxilejun
修改于 2022-09-15 05:13:27
修改于 2022-09-15 05:13:27
56200
代码可运行
举报
文章被收录于专栏:wxilejun的专栏wxilejun的专栏
运行总次数:0
代码可运行

转载来源: https://www.cnblogs.com/zhouandke/p/16695968.html

  接手的项目还在用 TinyMapper 的一个早期版本用来做自动映射工具,TinyMapper 虽然速度快,但在配置里不能转换类型,比如 deleted 在数据库中用 0、1 表示,转换成实体模型时没法转换成 bool 类型,就为了这一个属性,就必须手写代码人工转换(怪不得有些 Mapper 作者认为 TinyMapper 是一个 toy)。   于是试一试 AutoMapper,可是这货需要提前注册所有的映射关系,程序员本来就已经很累了。。。(最新版 TinyMapper 也要求提前注册所有映射关系)。   找出以前使用过的 ValueInjecter,可扩展性很强,使用反射来实现。虽然我认为对现在处理器性能而言,快慢已经不太重要了,但它速度实在太慢了,有些测试项目消耗时间是 json反序列化的一半,TinyMapper 和 AutoMapper 均使用 emit 实现,非常接近手写代码的速度了。   在 nuget.org 上找了找,还发现两个非常不错的 mapper:   1. UltraMapper 不需要提前注册映射关系,而且使用 ReferenceTracking 解决了循环问题。   2. HigLabo.Mapper 也不需要提前注册映射关系(看来牛人都对提前注册很不爽),支持 object 转换为Dictionary,提出了 PostAction 概念(自动映射出目标对象后,还可以执行自定义动作进行手工赋值,这样就不需要费力实现 Flattening 什么的了)。但试用过程中,发现不能实现 Array 到 List 的转换,而且作者也不打算改。。。   既然各个 Mapper 都不太顺手,并且这段时间疫情封控,于是决定自己手撸一个POCO的 Mapper,目标如下:   1. 不需要提前注册映射关系   2. 像 json序列化/反序列化一样,同名属性尽可能映射(比如 int? 到 enum)   3. 增加 HigLabo.Mapper的PostAction概念   4. 使用 表达式树/Emit 提高速度

  编写过程中参考了 TinyMapper 和UltraMapper的代码,使用示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1     public class Person
 2     {
 3         public int Id { get; set; }
 4 
 5         public string Name { get; set; }
 6         // Same Name, different type
 7         public byte? Age { get; set; }
 8     }
 9 
10     public class PersonDto
11     {
12         public int Id { get; set; }
13 
14         public string Name { get; set; }
15 
16         public int? Age { get; set; }
17 
18         public string Description { get; set; }
19     }
20 
21     class Program
22     {
23         static void Main(string[] args)
24         {
25             // register PostAction
26             ZK.Mapper.SimpleMapper.Default.SetPostAction<Person, PersonDto>((p, dto) =>
27             {
28                 if (dto == null)
29                 {
30                     return dto;
31                 }
32                 dto.Description = p.Age.HasValue ? $"{p.Name} age is {p.Age}" : $"{p.Name} age is unknown";
33                 return dto;
34             });
35 
36             var p = new Person()
37             {
38                 Id = 1,
39                 Name = "john",
40                 Age = 32
41             };
42 
43             var dto = ZK.Mapper.SimpleMapper.Default.Map<PersonDto>(p);
44             Console.WriteLine(dto.Description);
45         }
46     }

  写写这里面的总结吧   1. 内部Mapper都是泛型的,但使用时传入的source很可能是 object,所以都是使用 反射创建泛型化的Mapper实例,然后建立TypePair的对应关系,这样就解偶了泛型   2. Emit 和 表达式树原理都是一样的,建立IL代码,所以效率非常接近   3. 如果能像 AutoMapper 那样提前注册所有映射关系,速度优化的手段会更多,估计这也是 TinyMapper 转成提前注册的原因吧。很多 Mapper 的性能测试都号称比 AutoMapper 快,但引用的都是老版本的 AutoMapper,但现在 AutoMapper 非常快,在一些简单测试里赶上了 TinyMapper。如果添加了很多特色功能,却很拖累速度。当然我还是觉得只要不是数量级的差距,都不太重要。   4. 我的潜意识里 SimpleMapper 就为解决当前项目的问题,比如从数据库中读出来对象,映射成Dto后,就不会被再使用了,所以SimpleMapper默认是浅拷贝。所以我也不打算发布到nuget。   5. SimpleMapper 功能不多,也没有为性能做太多优化,所以结构比较清晰,有兴趣的朋友阅读起来应该不难。

SimpleMapper 代码地址

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
AutoMapper学习
简单来说就是:就是根据A的模型和B的模型中的定义,自动将A模型映射为一个全新的B模型。
全栈程序员站长
2022/11/19
1.3K0
AutoMapper学习
C#中通过Mapster实现轻量级高效对象映射器
当谈到 C# 中的对象关系映射时,许多人会立即想到 AutoMapper。事实上,AutoMapper 是一个出色的对象映射库。
郑子铭
2024/12/30
3090
C#中通过Mapster实现轻量级高效对象映射器
从壹开始前后端分离【 .NET Core2.2 +Vue2 】框架之十二 、十三:DTOs(数据传输对象)
在接口 IBlogArticleServices.cs和 类BlogArticleServices.cs中,添加GetBlogDetails()方法,返回类型是BlogViewModels
老张的哲学
2022/04/10
5870
从壹开始前后端分离【 .NET Core2.2 +Vue2 】框架之十二 、十三:DTOs(数据传输对象)
浅入 AutoMapper
在 Nuget 搜索即可安装,目前笔者使用的版本是 10.1.1,AutoMapper 的程序集大约 280KB。
痴者工良
2021/04/26
1.5K0
ASP.NET Core Web中使用AutoMapper进行对象映射
在日常开发中,我们常常需要将一个对象映射到另一个对象,这个过程中可能需要编写大量的重复性代码,如果每次都手动编写,不仅会影响开发效率,而且当项目越来越复杂、庞大的时候还容易出现错误。为了解决这个问题,对象映射库就随之而出了,这些库可以自动完成对象之间的映射,从而减少大量的开发工作量,提高开发工作效率。今天我们来讲讲在ASP.NET Core Web中使用AutoMapper快速进行对象映射。
追逐时光者
2024/05/18
5410
ASP.NET Core Web中使用AutoMapper进行对象映射
【5min+】 对象映射只有AutoMapper?试试Mapster
【五分钟的dotnet】是一个利用您的碎片化时间来学习和丰富.net知识的博文系列。它所包含了.net体系中可能会涉及到的方方面面,比如C#的小细节,AspnetCore,微服务中的.net知识等等。 5min+不是超过5分钟的意思,"+"是知识的增加。so,它是让您花费5分钟以下的时间来提升您的知识储备量。
句幽
2020/04/27
2.1K0
MapStruct1.5使用教程(高级版)
MapStruct是一个Java注解处理器,它的主要功能是自动生成类型安全、高性能且无依赖的bean映射代码。这个工具基于“约定优于配置”的原则,极大地简化了Java Bean类型之间的映射实现过程。
公众号:码到三十五
2024/03/19
1.9K0
AutoMapper:让对象映射变得更简单
在日常开发中,我们经常需要在不同的对象之间进行数据转换。例如,将数据库查询结果(DTO)转换为业务对象(BO),或将业务对象转换为视图模型(ViewModel)。如果手动编写这些转换逻辑,代码会变得冗长且容易出错。这时,AutoMapper 就派上了用场!
郑子铭
2025/05/06
1400
AutoMapper:让对象映射变得更简单
AutoMapper使用手册(一)
介绍 AutoMapper是一个轻量级的类库,主要功能是把一个对象转换成另外一个对象,而避免我们每次都手工去转换。 常见几种使用场景: 对外服务接口,把逻辑层的实体转换成服务消费者需要的字段。 UI展现层,把业务对象转换成UI需要展现的字段。 用户的输入输出,把DTO与领域模型互转。 AutoMapper支持的平台: .NET 4+ Silverlight 5 Windows Phone 8+ .NET for Windows Store apps (WinRT) Windows Uni
蘑菇先生
2018/05/21
2.1K0
AutoMapper快速上手
AutoMapper是一个简单的对象映射框架(OOM),对象映射原理是把一种类型的输入对象转换为不同类型的输出对象,通俗讲就是通过一些约束讲一种类型中数据自动映射到另一数据类型中
莫问今朝
2019/02/25
4.3K0
浅入 ABP 系列(7):对象映射
写博客的过程中,发现很多基础理论太薄弱,因此很多专业词汇可能会解释错误或者不准确,建议读者多参考官方文档或者其它书籍。
痴者工良
2021/04/26
1.9K0
ASP.NET.Core中使用AutoMapper
   接下来创建一个类来继承AutoMapper的Profile类与实现刚才创建的标志接口IProfile,并且在构造函数中配置关系映射
莫问今朝
2019/02/25
3K1
【C#】AutoMapper 使用手册
官方文档:https://docs.automapper.org/en/latest/
丹枫无迹
2020/06/15
2.9K0
在 Kotlin 的 data class 中使用 MapStruct
data class 的 copy() 是复制函数,能够复制一个对象的全部属性,也能复制部分的属性。
fengzhizi715
2020/08/31
2.3K0
打开orika的正确方式
缘起 架构分层 开发分布式的项目时,DO持久化对象和DTO传输对象的转换是不可避免的。集中式项目中,DO-DAO-SERVICE-WEB的分层再寻常不过,但分布式架构(或微服务架构)需要拆分模块时,不
kirito-moe
2018/04/27
3.9K0
打开orika的正确方式
ABP入门系列(13)——Redis缓存用起来
源码路径:Github-LearningMpaAbp 1. 引言 创建任务时我们需要指定分配给谁,Demo中我们使用一个下拉列表用来显示当前系统的所有用户,以供用户选择。我们每创建一个任务时都要去数据库取一次用户列表,然后绑定到用户下拉列表显示。如果就单单对一个demo来说,这样实现也无可厚非,但是在正式项目中,显然是不合理的,浪费程序性能,有待优化。 说到优化,你肯定立马就想到了使用缓存。是的,缓存是提高程序性能的高效方式之一。 这一节我们就针对这一案例来看一看Abp中如何使用缓存来提高程序性能。
圣杰
2018/01/11
2.5K0
ABP入门系列(13)——Redis缓存用起来
ABP入门系列(4)——创建应用服务
一、解释下应用服务层 应用服务用于将领域(业务)逻辑暴露给展现层。展现层通过传入DTO(数据传输对象)参数来调用应用服务,而应用服务通过领域对象来执行相应的业务逻辑并且将DTO返回给展现层。因此,展现层和领域层将被完全隔离开来。 以下几点,在创建应用服务时需要注意: 在ABP中,一个应用服务需要实现IApplicationService接口,最好的实践是针对每个应用服务都创建相应继承自IApplicationService的接口。(通过继承该接口,ABP会自动帮助依赖注入) ABP为IApplication
圣杰
2018/01/11
1.8K0
关于领域模型转换的那些事儿
我们在软件开发设计及开发过程中,习惯将软件横向拆分为几个层。比如常见的三层架构:表现层(VIEW/UI)、业务逻辑层(SERVICE/BAL)、数据访问层(DAO/DAL)。如下图:
端碗吹水
2020/09/23
1.2K0
关于领域模型转换的那些事儿
一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](五)
时间飞逝,一个星期又过去了,今天还是星期五,Rector在图享网继续跟大家分享系列文本:一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar]
Rector
2018/02/02
1.8K0
从头编写 asp.net core 2.0 web api 基础框架 (5) EF CRUD
Github源码地址:https://github.com/solenovex/Building-asp.net-core-2-web-api-starter-template-from-scratch 这是第一大部分的最后一小部分。要完成CRUD的操作。 Repository Pattern 我们可以直接在Controller访问DbContext,但是可能会有一些问题: 1.相关的一些代码到处重复,有可能在程序中很多地方我都会更新Product,那样的话我可能就会在多个Action里面写同样的代码,而比
solenovex
2018/03/01
3.7K0
从头编写 asp.net core 2.0 web api 基础框架 (5) EF CRUD
相关推荐
AutoMapper学习
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验