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)的更多相关文章

  1. Asp.net 面向接口可扩展框架之核心容器(含测试代码下载)

    新框架的容器部分终于调通了!容器实在太重要了,所以有用了一个名词叫“核心容器”. 容器为什么那么重要呢?这个有必要好好说道说道. 1.首先我们从框架名称面向接口编程说起,什么是面向接口编程?(这个度娘 ...

  2. Asp.net 面向接口可扩展框架之业务规则引擎扩展组件

    随着面向接口可扩展框架的继续开发,有些功能开发出现了"瓶颈",有太多的东西要写死才好做.但写死的代码扩展性是非常的不好,迷茫中寻找出入... 进而想到我以前开发的好几个项目,都已有 ...

  3. Asp.net 面向接口可扩展框架之消息队列组件

    消息队列对大多数人应该比较陌生.但是要提到MQ听说过的人会多很多.MQ就是英文单词"Message queue"的缩写,翻译成中文就是消息队列(我英语差,翻译错了请告知). PS: ...

  4. Asp.net 面向接口可扩展框架之类型转化基础服务

    新框架正在逐步完善,可喜可贺的是基础服务部分初具模样了,给大家分享一下 由于基础服务涉及面太广,也没开发完,这篇只介绍其中的类型转化部分,命名为类型转化基础服务,其实就是基础服务模块的类型转化子模块 ...

  5. Asp.net 面向接口可扩展框架之应用程序上下文作用域组件

    在团队中推广面向接口开发两年左右,成果总体来说我还是挺满意的,使用面向接口开发的模块使用Unity容器配置的功能非常稳定,便于共享迁移(另一个项目使用只需要复制配置和调用接口即可),如果再配合上DI那 ...

  6. Asp.net 面向接口可扩展框架之“Mvc扩展框架及DI”

    标题“Mvc扩展框架及DI”有点绕口,我也想不出好的命名,因为这个内容很杂,涉及多个模块,但在日常开发又密不可分 首先说Mvc扩展框架,该Mvc扩展就是把以前的那个Mvc分区扩展框架迁移过来,并优化整 ...

  7. Asp.net 面向接口可扩展框架之数据处理模块及EntityFramework扩展和Dapper扩展(含干货)

    接口数据处理模块是什么意思呢?实际上很简单,就是使用面向接口的思想和方式来做数据处理. 还提到EntityFramework和Dapper,EntityFramework和Dapper是.net环境下 ...

  8. 面向接口可扩展框架之“Mvc扩展框架及DI”

    面向接口可扩展框架之“Mvc扩展框架及DI” 标题“Mvc扩展框架及DI”有点绕口,我也想不出好的命名,因为这个内容很杂,涉及多个模块,但在日常开发又密不可分 首先说Mvc扩展框架,该Mvc扩展就是把 ...

  9. python接口自动化(三十二)--Python发送邮件(常见四种邮件内容)番外篇——上(详解)

    简介 本篇文章与前边没有多大关联,就是对前边有关发邮件的总结和梳理.在写脚本时,放到后台运行,想知道执行情况,会通过邮件.SMS(短信).飞信.微信等方式通知管理员,用的最多的是邮件.在linux下, ...

随机推荐

  1. Python黑帽编程2.5 函数

    Python黑帽编程2.5 函数 写了几节的基础知识,真心感觉有点力不从心.这块的内容说实话,看文档是最好的方式,本人的写作水平,真的是找不出更好的写法,头疼.简单带过和没写一样,写详细了和本系列教程 ...

  2. 跟vczh看实例学编译原理——二:实现Tinymoe的词法分析

    文章中引用的代码均来自https://github.com/vczh/tinymoe.   实现Tinymoe的第一步自然是一个词法分析器.词法分析其所作的事情很简单,就是把一份代码分割成若干个tok ...

  3. 喜大普奔,微软Microsoft JDBC Driver For SQL Server已发布到maven中央仓库

    相信通过java和SQLServer开发应用的同学们都经历过如下类似的问题. 微软提供的JDBC官方驱动没有放置在Maven仓库中,这样如果你的Java应用需要访问SQL Server,你不得不下载s ...

  4. ASP.NET MVC 5 - 验证编辑方法(Edit method)和编辑视图(Edit view)

    在本节中,您将验证电影控制器生成的编辑方法(Edit action methods)和视图.但是首先将修改点代码,使得发布日期属性(ReleaseDate)看上去更好.打开Models \ Movie ...

  5. 部分安卓手机微信浏览器中使用XMLHttpRequest 2上传图片显示字节数为0的解决办法

    前端JS中使用XMLHttpRequest 2上传图片到服务器,PC端和大部分手机上都正常,但在少部分安卓手机上上传失败,服务器上查看图片,显示字节数为0.下面是上传图片的核心代码: HTML < ...

  6. 注册OCX失败

    今天注册某个OCX时,Windows报告以下错误: 模块“XXX.ocx”已加载,但对 DllRegisterServer 的调用失败,错误代码为 0x80040200. 这是Windows权限引起的 ...

  7. Atitit 教育与培训学校 的计划策划 v4 qc18

    Atitit 教育与培训学校 的计划策划 v4 qc18 1.1. 版本历史12. 教育历史的前世今生12.1. 自学vs 家庭学校vs 私立学校vs 公立学校模式 vs 企业内部学校 vs 其他商业 ...

  8. HTML5新增标签与属性

    目录 一.HTML5新增属性 1.1.contextmenu 1.2.contentEditable 1.3.hidden 1.4.draggable 1.5.data-* 1.6.placehold ...

  9. Derived Column 用法

    Derived Column Component 用法是为数据流增加派生列,Derived column  有两种用法:add as new column 或 replace . 图中,增加一个 De ...

  10. UGUI 之获取当前控件的高度

    当Canvas Scaler选择Constant Pixel Size 当前的分辨率会被被固定,可以用RectTransform类里面的.rect变量值获取 height或Width. 在次情况下获取 ...