在进行一些MIS相关的项目开发中,我们经常会涉及到一些数据对象和视图模型之间的互相转换,

public class Customer        //mapped from db
    {
        public
int Id { get; set; }
        public
string FirstName { get; set; }
        public
string LastName { get; set; }
        public
DateTime DateOfBirth { get; set; }
        public
int NumberOfOrders { get; set; }
        public
int IsVIP { get; set; }
    }

public
class
CustomerViewItem
    {
        public
int Id { get; set; }
        public
string FirstName { get; set; }
        public
string LastName { get; set; }
        public
DateTime DateOfBirth { get; set; }
        public
int NumberOfOrders { get; set; }
        public
bool IsVIP { get; set; }
    }

这样两个对象的属性非常相似,并且往往属性还不少,在这两种对象之间互相转换是一个非常枯燥的事情。纯手工操作绝对是件吃力不讨好的事情,此前我曾经写过一个通过反射来比较这两个对象,根据名称和类型匹配属性来互相赋值。抛开性能问题且不谈,这样做也有一个局限性,那就是有差异的属性如何处理的问题,例如这里的 IsVIP属性。

虽然这些问题也可以通过来扩充那个方法为转换类来解决,但这种Object-Object Map操作已经有人总结出了一系列的比较完善的框架了,基于不重复造轮子的原则,这里我便推荐几个佼佼者:

AutoMapper

AutoMapper是我用得较多的一个库,主要原因是它的接口非常简洁,并且功能非常完善,基本上需要的功能都能通过很少的代码实现。不过貌似它主要是通过反射来实现的,并没有做多少性能优化,因此对于性能额手动映射比起来有较大差距。可以用于一些对性能要求不高的场合。

Emit Mapper

从其名字就可以看出,它是采用emit方式在运行时动态生成IL,性能基本上是接近手动编写代码的硬编码的了。

ValueInjecter

ValueInjectter的设计理念貌似和AutoMapper不大一样。它并不是像AutoMapper那样专注着于两个相似的对象之间的互相转换,而是提供了非常灵活的两个对象基于契约的转换机制(属性匹配也是契约的一种)。在两个对象互转方面它不像AutoMapper那样面面俱到,但却小巧而灵活。例如,它可以支持多个对象转换为一个对象(AutoMapper也能实现,相对较为麻烦),能将一个url的参数转换为对象。园子里有一篇文章可以看下:http://www.cnblogs.com/suijing/p/ValueInjecter_demo.html

推荐几个对象映射(Object-Object Map)的库的更多相关文章

  1. 一:ORM关系对象映射(Object Relational Mapping,简称ORM)

    狼来的日子里! 奋发博取 10)django-ORM(创建,字段类型,字段参数) 一:ORM关系对象映射(Object Relational Mapping,简称ORM) ORM分两种: DB fir ...

  2. django关系对象映射(Object Relational Mapping,简称ORM)

    Model 创建数据库,设计表结构和字段 django中遵循 Code Frist 的原则,即:根据代码中定义的类来自动生成数据库表 from django.db import models clas ...

  3. 基于JsonPath和XmlPath的对象映射(Object Mapping)

    rest-assured支持映射Java对象到Json和XML以及从Json和XML中映射到Java对象.Json映射需要在classpath 中有Jackson.Jackson 2或者是Gson,X ...

  4. JSP——JavaServer Page中的隐式对象(implicit object)、指令(directive)、脚本元素(scripting element)、动作(action)、EL表达式

    目录 1.JSP概述 2.注释(comment) 2.1.JSP注释 2.2.HTML注释 3.隐式对象(implicit object) 3.1.隐式对象清单 3.2.request对象 3.3.o ...

  5. 玩转Web之Json(四)---json与(Object/List/Map)的相互转化

    在做web应用时,经常需要将json转化成Object/list/map或者将Object/List/map转化成json,通过简单封装可以在写代码是减轻很多负担.本文将给出json转化的一系列方法. ...

  6. 有趣Web之Json(四)---json与(Object/List/Map)相互转化

    干web报名时间.通常,他们需要json转换为Object/list/map要么Object/List/map转换为json,由能够编写代码的简单包装非常多,以减轻负担. 本文将给出json的一系列的 ...

  7. JAVA中对List<map<String,Object>>根据map某个key值进行排序

    方法compareTo()比较此对象与指定对象的顺序.如果该对象小于.等于或大于指定对象,则分别返回负整数.零或正整数.返回整数,1,-1,0:返回1表示大于,返回-1表示小于,返回0表示相等. 普通 ...

  8. map泛型 map不指定泛型 与 Map<Object,Object>的区别

    map泛型 map不指定泛型 与 Map<Object,Object>的区别 private void viewDetail(){ Map map1 = new HashMap(); Ma ...

  9. Bootstrap<基础二十七> 多媒体对象(Media Object)

    Bootstrap 中的多媒体对象(Media Object).这些抽象的对象样式用于创建各种类型的组件(比如:博客评论),我们可以在组件中使用图文混排,图像可以左对齐或者右对齐.媒体对象可以用更少的 ...

随机推荐

  1. Linux内核【链表】整理笔记(2) 【转】

    转自:http://blog.chinaunix.net/uid-23069658-id-4725279.html 关于链表我们更多时候是对其进行遍历的需求,上一篇博文里我们主要认识了一下和链表操作比 ...

  2. UVA 11076 Add Again

    题目链接:UVA-33478 题意为给定n个数,求这n个数能组成的所有不同的排列组成的数字的和. 思路:发现对于任意一个数字,其在每一位出现的次数是相同的.换言之,所有数字的每一位相加的和是相同的. ...

  3. 如何消除类型是submit类型的按钮的默认文字 ‘确认提交’

    只需要加上value="" 即可.默认的文字就可以去掉了.

  4. 循环select查询结果集

    --标记id --每次查询特定列比标记id大的第一条数据, --同时更新标记id,直到查询结果为空 ) set @id='' begin @id=id from T_SGZ where id>@ ...

  5. intellij idea 无法创建类文件,方法。

  6. JVM字节码执行引擎和动态绑定原理

    1.执行引擎 所有Java虚拟机的执行引擎都是一致的: 输入的是字节码文件,处理过程就是解析过程,最后输出执行结果. 在整个过程不同的数据在不同的结构中进行处理. 2.栈帧 jvm进行方法调用和方法执 ...

  7. DEADBEEF

    “DEADBEEF”是什么?可能很多人都没有听说过.DEADBEEF不是“死牛肉”的意思,而是一个十六进制数字,即0xDEADBEEF.最初使用它的是IBM的RS/6000系统.在该系统中,已分配但还 ...

  8. FFT模板 生成函数 原根 多项式求逆 多项式开根

    FFT #include<iostream> #include<cstring> #include<cstdlib> #include<cstdio> ...

  9. JavaScript的基础学习(一)

    一.JavaScript概述 JavaScript的历史 1992年Nombas开发出C-minus-minus(C--)的嵌入式脚本语言(最初绑定在CEnvi软件中).后将其改名ScriptEase ...

  10. 洛谷——P2799 国王的魔镜

    P2799 国王的魔镜 题目描述 国王有一个魔镜,可以把任何接触镜面的东西变成原来的两倍——只是,因为是镜子嘛,增加的那部分是反的.比如一条项链,我们用AB来表示,不同的字母表示不同颜色的珍珠.如果把 ...