推荐几个对象映射(Object-Object Map)的库
在进行一些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是我用得较多的一个库,主要原因是它的接口非常简洁,并且功能非常完善,基本上需要的功能都能通过很少的代码实现。不过貌似它主要是通过反射来实现的,并没有做多少性能优化,因此对于性能额手动映射比起来有较大差距。可以用于一些对性能要求不高的场合。
从其名字就可以看出,它是采用emit方式在运行时动态生成IL,性能基本上是接近手动编写代码的硬编码的了。
ValueInjectter的设计理念貌似和AutoMapper不大一样。它并不是像AutoMapper那样专注着于两个相似的对象之间的互相转换,而是提供了非常灵活的两个对象基于契约的转换机制(属性匹配也是契约的一种)。在两个对象互转方面它不像AutoMapper那样面面俱到,但却小巧而灵活。例如,它可以支持多个对象转换为一个对象(AutoMapper也能实现,相对较为麻烦),能将一个url的参数转换为对象。园子里有一篇文章可以看下:http://www.cnblogs.com/suijing/p/ValueInjecter_demo.html
推荐几个对象映射(Object-Object Map)的库的更多相关文章
- 一:ORM关系对象映射(Object Relational Mapping,简称ORM)
狼来的日子里! 奋发博取 10)django-ORM(创建,字段类型,字段参数) 一:ORM关系对象映射(Object Relational Mapping,简称ORM) ORM分两种: DB fir ...
- django关系对象映射(Object Relational Mapping,简称ORM)
Model 创建数据库,设计表结构和字段 django中遵循 Code Frist 的原则,即:根据代码中定义的类来自动生成数据库表 from django.db import models clas ...
- 基于JsonPath和XmlPath的对象映射(Object Mapping)
rest-assured支持映射Java对象到Json和XML以及从Json和XML中映射到Java对象.Json映射需要在classpath 中有Jackson.Jackson 2或者是Gson,X ...
- 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 ...
- 玩转Web之Json(四)---json与(Object/List/Map)的相互转化
在做web应用时,经常需要将json转化成Object/list/map或者将Object/List/map转化成json,通过简单封装可以在写代码是减轻很多负担.本文将给出json转化的一系列方法. ...
- 有趣Web之Json(四)---json与(Object/List/Map)相互转化
干web报名时间.通常,他们需要json转换为Object/list/map要么Object/List/map转换为json,由能够编写代码的简单包装非常多,以减轻负担. 本文将给出json的一系列的 ...
- JAVA中对List<map<String,Object>>根据map某个key值进行排序
方法compareTo()比较此对象与指定对象的顺序.如果该对象小于.等于或大于指定对象,则分别返回负整数.零或正整数.返回整数,1,-1,0:返回1表示大于,返回-1表示小于,返回0表示相等. 普通 ...
- map泛型 map不指定泛型 与 Map<Object,Object>的区别
map泛型 map不指定泛型 与 Map<Object,Object>的区别 private void viewDetail(){ Map map1 = new HashMap(); Ma ...
- Bootstrap<基础二十七> 多媒体对象(Media Object)
Bootstrap 中的多媒体对象(Media Object).这些抽象的对象样式用于创建各种类型的组件(比如:博客评论),我们可以在组件中使用图文混排,图像可以左对齐或者右对齐.媒体对象可以用更少的 ...
随机推荐
- pillow模块的学习
https://github.com/wangbinyq/pillow_example http://pillow.readthedocs.org/en/latest/handbook/tutoria ...
- redis cluster 实现
Redis cluster是一个redis官方提供的集群功能,集群节点最小3个节点,配置比较多,记录下来,以供下次使用.我在这使用的redis 4.0.6. 因为最新的ruby redis扩展需要ru ...
- 【hihocoder】sam-2
原意是把sam那一堆做完…… 这题还是很sb的,$\sum{maxlen(s)-minlen(s)+1}$就是本质不同的子串数量 然后因为suffix link的性质,maxlen[fa[s]]=mi ...
- C后端设计开发 - 第4章-武技-常见轮子下三路
正文 第4章-武技-常见轮子下三路 后记 如果有错误, 欢迎指正. 有好的补充, 和疑问欢迎交流, 一块提高. 在此谢谢大家了. Moonlight Shadow 纪念那个我爱的, 被我感动的女孩 ...
- Go语言大神亲述:历七劫方可成为程序员!
“历劫1”:你坚信你可以用Go来做面向对象编程? 在经历了一次Go应用之旅之后,你可能就会开始思考:“怎么样才能让这种语言更像面向对象的编程语言?”因为你已经习惯了这种编程,你想要制作健壮的代码.想要 ...
- 全国省市区数据SQL - 省市区
转载:https://www.cnblogs.com/flywind/p/6036801.html
- django使用haystack对接Elasticsearch实现商品搜索
# 原创,转载请留言联系 前言: 在做一个商城项目的时候,需要实现商品搜索功能. 说到搜索,第一时间想到的是数据库的 select * from tb_sku where name like %苹果手 ...
- python_day4学习笔记
一.内置函数
- Linux安装mysql.8.0.12
1. linux安装mysql8.0.12,亲测可用. 以下是安装过程中出现的问题: 1 [root@localtest1 file]# systemctl start mysqld 2 Job fo ...
- Maximum Gap——桶排序
Given an unsorted array, find the maximum difference between the successive elements in its sorted f ...