码迷,mamicode.com
首页 > 其他好文 > 详细

推荐几个对象映射(Object-Object Map)的库

时间:2014-08-27 00:07:46      阅读:275      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   strong   for   数据   问题   代码   

在进行一些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)的库

标签:style   blog   http   color   strong   for   数据   问题   代码   

原文地址:http://www.cnblogs.com/TianFang/p/3938383.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!