推荐几个对象映射(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

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

 

Emit Mapper

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

 

ValueInjecter

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

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