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

  • 相关阅读:
    VS2010安装笔记
    Blend4中文版中截取图片的方法
    改变窗口的位置 (转载)
    窗口的位置
    windows消息大全
    WM_MOUSELEAVE和WM_MOUSEHOVER使用
    setwindowpos
    无注册表的COM调用
    WM_CLOSE WM_QUIT WM_DESTROY 三者的区别
    WM_MOUSEWHEEL消息
  • 原文地址:https://www.cnblogs.com/TianFang/p/3938383.html
Copyright © 2020-2023  润新知