推薦幾個對象映射(Object-Object Map)的庫

在進行一些MIS相關的項目開發中,咱們常常會涉及到一些數據對象和視圖模型之間的互相轉換,html

    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屬性。 app

雖然這些問題也能夠經過來擴充那個方法爲轉換類來解決,但這種Object-Object Map操做已經有人總結出了一系列的比較完善的框架了,基於不重複造輪子的原則,這裏我便推薦幾個佼佼者: 框架

 

AutoMapper性能

AutoMapper是我用得較多的一個庫,主要緣由是它的接口很是簡潔,而且功能很是完善,基本上須要的功能都能經過不多的代碼實現。不過貌似它主要是經過反射來實現的,並無作多少性能優化,所以對於性能額手動映射比起來有較大差距。能夠用於一些對性能要求不高的場合。 優化

 

Emit Mapperui

從其名字就能夠看出,它是採用emit方式在運行時動態生成IL,性能基本上是接近手動編寫代碼的硬編碼的了。 編碼

 

ValueInjecterurl

ValueInjectter的設計理念貌似和AutoMapper不大同樣。它並非像AutoMapper那樣專一着於兩個類似的對象之間的互相轉換,而是提供了很是靈活的兩個對象基於契約的轉換機制(屬性匹配也是契約的一種)。在兩個對象互轉方面它不像AutoMapper那樣面面俱到,但卻小巧而靈活。例如,它能夠支持多個對象轉換爲一個對象(AutoMapper也能實現,相對較爲麻煩),能將一個url的參數轉換爲對象。園子裏有一篇文章能夠看下:http://www.cnblogs.com/suijing/p/ValueInjecter_demo.html spa

相關文章
相關標籤/搜索