Asp.net 面向接口可扩展框架之使用“类型转化基础服务”测试四种Mapper(AutoMapper、EmitMapper、NLiteMapper及TinyMapper)
Asp.net 面向接口可扩展框架的“类型转化基础服务”是我认为除了“核心容器”之外最为重要的组成部分
但是前面博文一出,争议很多,为此我再写一篇类型转化基础服务和各种Mapper结合的例子,顺便对各种Mapper做个简单的优缺点对比
我对第三方组件评介有三个标准,一、可用性,二、性能,三、易用性
本例子中四种Mapper以前我都没使用过(因为以前我都用自己的Mapper),本次测试可能不准确,错误的地方请大家指正
AutoMapper使用的是4.2.1.0,需要.net4.5支持(我使用Nuget没找到到.net4.0下可用的版本)
EmitMapper使用的是1.0版本,使用.net4.0
NLite使用的是0.9.6,使用.net4.0
TinyMapper使用的是2.0.0.40,使用.net4.0
一、简单封装
1、各种Mappers封装项目截图

2、各种Mapper封装类




3、简单个人第一印象
3.1 AutoMapper的dll有267k,比较大,感觉功能很全面
支持自定义配置,支持静态方法和实例方法,提供默认实例, 支持传Type来转化,扩展性不错,功能强大
3.2 EmitMapper的dll才99k,感觉功能比较简练
提供默认实例,支持自定义配置
3.3 NLite的dll有646k,dll偏大,其中很多Mapper以外的功能,是个套件,如果需要其中的多项功能才比较划算(这里不展开)
3.4 TinyMapper的dll才47k,最轻量,如果功能和性能都不打折扣就完美了
只支持静态方法
二、继承类型转化科目测试
1、继承类型转化可用性测试代码




大家要看清楚,不管哪种Mapper,我都是用相同方法(GlobalServices.Instance.Convert<A, B>(a))来调用的
其一、这是为了各种Mapper测试的公平性,不要说那个多个if那个多个哈希
其二、也就是说,各种Mapper都可以使用“插件式”在本框架中运行,如果为了突然发现某种Mapper工具有“bug”,可以“秒切”为另一种Mapper,所有调用的地方几乎都不用修改
2、测试结果

没问题,以上四种Mapper轻松胜任,但是有一个细微的差别,AutoMapper是直接使用类型转化处理继承类型的转化的,对象引用都是同一个。其他mapper应该是“copy”的
3、性能测试(100万次)

A:TinyMapper最快
B:AutoMapper其次(没想明白,直接类型转化应该算“作弊”,却还没有TinyMapper快)
C:EmitMapper和NLiteMapper旗鼓相当,EmitMappe稍快
4、易用性不用说,都很简单
三、简单对象转化科目测试
1、测试代码



AutoMapper居然转化失败,实在令人失望,网上一查资料,需要扩展
2、对AutoMapper单独扩展再测


扩展后可以正常转化,而且扩展也非常简单,但是这么简单的代码为什么非要使用者写呢?我暂时还不太理解,至少易用性上是要扣分的
3、性能测试(10万次)

A:TinyMapper再拔头筹(除HandCode外),可喜可贺
B:EmitMapper其次,性能不错,Emit果然效果好
C:再次是AutoMapper,是EmitMapper的1.5倍左右,AutoMapper没有我想象的那么差
D:NLiteMapper垫底,不太明白,好像网上有说NLiteMapper也是使用Emit做的,或许我用的这个版本还不是Emit(为了尽可能的通用,我尽量使用.net4.0)
4、可用性总结,AutoMapper扣分,简单映射还是要手动注册规则
网上有人把每次使用AutoMapper时都尝试注册,虽然丑了点是个办法,不知道是否对性能有影响
四、成员名映射科目测试
1、测试代码

AutoMapper的配置规则

EmitMapper的配置规则

TinyMapper的配置规则


其实需求很简单,把A转化C,但是要把A的id属性映射到C的AId属性上,但是NLiteMapper我没找到配置方法
2、测试结果

NLiteMapper我没找到配置方法,所以AId属性没转化成功,初步判断NLiteMapper无法支持这种需求
3、性能测试(10万次)

A:TinyMapper继续头筹,而且遥遥领先
B:EmitMapper其次,比TinyMapper差太远了,对这种配置规则支持不好
C:再次是AutoMapper,比TinyMapper就差更远了,还是对这种配置规则支持不好
D:NLiteMapper性能又垫底,而且还没实现需求
4、易用性
A:TinyMapper扩展的方式最为“优美”,使用表达式增加新的映射规则,得分最高
B:AutoMapper扩展的方式其次,因为每对类型都配置是硬伤
C:EmitMapper扩展的方式有点糟糕了,就是硬编码,但是性能却比硬编码差多了,比TinyMapper都差不少(原因以后可以探讨一下)
D:NLiteMapper垫底,没实现需求
五、树状递归转化科目测试
1、测试代码


以上代码是故意把TinyMapper注释了,是为了单独测试(TinyMapper会出严重错误)
2、测试结果

2.1、单独测试TinyMapper

A:这次TinyMapper不行了,估计是我测试的例子特殊,子对象的类型是本身触发了Bug,严重的bug,不只是不能转化成功,直接死循环
注:不知道TinyMapper最新版本是否有这个问题,感兴趣的可以测试一下
B:其他三种Mapper都能胜任
3、性能测试(10万次,除TinyMapper外)

A:这次EmitMapper拔得头筹
B:AutoMapper和NLiteMapper差不多,AutoMapper稍好一点
C:TinyMapper缺席,执行会报错
4、易用性
AutoMapper硬伤,每对类型都要配置
总结一下,其一、网上有很多开源项目组件已经很强大了,如果能很好的未我所用可以大大加快项目开发的速度,甚至是项目的优化(含性能);其二、网上的项目也是人开发的,总会有这样或者那样的“问题”。我们要以一个包容的心态对待这些项目。一般来说功能全面,使用方便,bug少的性能可能不好;我们需要用其长,避其短。最好遵循“里氏代换原则”和“最少知识原则”,如果这个组件已经不适用了可以方便的替换不用满项目的修改。
Asp.net 面向接口可扩展框架之使用“类型转化基础服务”测试四种Mapper(AutoMapper、EmitMapper、NLiteMapper及TinyMapper)的更多相关文章
- Asp.net 面向接口可扩展框架之核心容器(含测试代码下载)
新框架的容器部分终于调通了!容器实在太重要了,所以有用了一个名词叫“核心容器”. 容器为什么那么重要呢?这个有必要好好说道说道. 1.首先我们从框架名称面向接口编程说起,什么是面向接口编程?(这个度娘 ...
- Asp.net 面向接口可扩展框架之业务规则引擎扩展组件
随着面向接口可扩展框架的继续开发,有些功能开发出现了"瓶颈",有太多的东西要写死才好做.但写死的代码扩展性是非常的不好,迷茫中寻找出入... 进而想到我以前开发的好几个项目,都已有 ...
- Asp.net 面向接口可扩展框架之消息队列组件
消息队列对大多数人应该比较陌生.但是要提到MQ听说过的人会多很多.MQ就是英文单词"Message queue"的缩写,翻译成中文就是消息队列(我英语差,翻译错了请告知). PS: ...
- Asp.net 面向接口可扩展框架之类型转化基础服务
新框架正在逐步完善,可喜可贺的是基础服务部分初具模样了,给大家分享一下 由于基础服务涉及面太广,也没开发完,这篇只介绍其中的类型转化部分,命名为类型转化基础服务,其实就是基础服务模块的类型转化子模块 ...
- Asp.net 面向接口可扩展框架之应用程序上下文作用域组件
在团队中推广面向接口开发两年左右,成果总体来说我还是挺满意的,使用面向接口开发的模块使用Unity容器配置的功能非常稳定,便于共享迁移(另一个项目使用只需要复制配置和调用接口即可),如果再配合上DI那 ...
- Asp.net 面向接口可扩展框架之“Mvc扩展框架及DI”
标题“Mvc扩展框架及DI”有点绕口,我也想不出好的命名,因为这个内容很杂,涉及多个模块,但在日常开发又密不可分 首先说Mvc扩展框架,该Mvc扩展就是把以前的那个Mvc分区扩展框架迁移过来,并优化整 ...
- Asp.net 面向接口可扩展框架之数据处理模块及EntityFramework扩展和Dapper扩展(含干货)
接口数据处理模块是什么意思呢?实际上很简单,就是使用面向接口的思想和方式来做数据处理. 还提到EntityFramework和Dapper,EntityFramework和Dapper是.net环境下 ...
- 面向接口可扩展框架之“Mvc扩展框架及DI”
面向接口可扩展框架之“Mvc扩展框架及DI” 标题“Mvc扩展框架及DI”有点绕口,我也想不出好的命名,因为这个内容很杂,涉及多个模块,但在日常开发又密不可分 首先说Mvc扩展框架,该Mvc扩展就是把 ...
- python接口自动化(三十二)--Python发送邮件(常见四种邮件内容)番外篇——上(详解)
简介 本篇文章与前边没有多大关联,就是对前边有关发邮件的总结和梳理.在写脚本时,放到后台运行,想知道执行情况,会通过邮件.SMS(短信).飞信.微信等方式通知管理员,用的最多的是邮件.在linux下, ...
随机推荐
- 走向面试之数据库基础:一、你必知必会的SQL语句练习-Part 1
本文是在Cat Qi的参考原帖的基础之上经本人一题一题练习后编辑而成,非原创,仅润色而已.另外,本文所列题目的解法并非只有一种,本文只是给出比较普通的一种而已,也希望各位园友能够自由发挥. 一.三点一 ...
- Redis系列(三)-Redis发布订阅及客户端编程
阅读目录 发布订阅模型 Redis中的发布订阅 客户端编程示例 0.3版本Hredis 发布订阅模型 在应用级其作用是为了减少依赖关系,通常也叫观察者模式.主要是把耦合点单独抽离出来作为第三方,隔离易 ...
- windows下Meteor+AngularJS开发的坑
有复杂的地方我再开贴记录,这里只记录容易解决的坑. 1. windows下手工增加smart package.直接将下载下来的包扔到meteor package中.记得将文件夹名字改得和smart.j ...
- EF6 Power Tools的妙用和问题
环境:vs2013+EF:6.1.3.0+Power Tools:Beta 4 power tools:是一个反向工程,在已有数据库的情况下,可以利用它生成Code Frist模式的代码. 问题: 它 ...
- Android开发学习之路-带文字的图片分享
有用过微信分享SDK的都应该知道,微信分享到朋友圈的时候是不能同时分享图片和文字的,只要有缩略图,那么文字就不会生效.那么问题就来了,如果我们想把APP内的某些内容连带图片一起分享到微信,是不是没办法 ...
- Android开发学习之路-LruCache使用和源码分析
LruCache的Lru指的是LeastRecentlyUsed,也就是近期最少使用算法.也就是说,当我们进行缓存的时候,如果缓存满了,会先淘汰使用的最少的缓存对象. 为什么要用LruCache?其实 ...
- Atitit Mysql查询优化器 存取类型 范围存取类型 索引存取类型 AND or的分析
Atitit Mysql查询优化器 存取类型 范围存取类型 索引存取类型 AND or的分析 Atitit Mysql查询优化器 存取类型 范围存取类型 索引存取类型 AND or的分析1 存 ...
- iOS----- Crash 分析(文二)-崩溃日志组成
iOS Crash 分析(文二)-崩溃日志组成 现在我们看一个淘宝iOS主客崩溃的例子: ### 1.进程信息 ### Incident Identifier: E4201F10-6F5F-40F9- ...
- 修改input框默认黄色背景
input:-webkit-autofill, textarea:-webkit-autofill, select:-webkit-autofill { -webkit-box-shadow: 0 0 ...
- Android开发-之数据的存储方式一
在Android中,数据的存储分为两种方式: 1.直接以文件的形式存储在目录中 2.以json格式存储在数据库中 将数据以文件的存储又分为两种方式: 1.生成.txt文件 2.生成xml文件 那么今天 ...