開源實體映射架構EmitMapper介紹

來源:互聯網
上載者:User

標籤:

開源實體映射架構EmitMapper介紹 

 

  • 綜述
      EmitMapper是一個開源實體映射架構,地址:http://emitmapper.codeplex.com/。      EmitMapper映射效率比較高,接近寫入程式碼。EmitMapper採用emit方式在運行時動態產生IL,而其他映射架構多是採用反射機制。此外EmitMapper最大限度地減少了拆箱裝箱操作和映射過程中的額外的調用。      EmitMapper支援.net的所有平台:Framework 3.5、Microsoft Silverlight 3、Mono。       EmitMapper的使用非常簡單,不需要指定任何的映射策略。系統會採用預設的映射配置器DefaultMapConfig完成映射操作。  
 1     public class Sourse
2 {
3 public int A;
4 public decimal? B;
5 public string C;
6 public Inner D;
7 public string E;
8 }
9
10 public class Dest
11 {
12 public int? A;
13 public decimal B;
14 public DateTime C;
15 public Inner D;
16 public string F;
17 }
18
19 public class Inner
20 {
21 public long D1;
22 public Guid D2;
23 }
24
25 Sourse src = new Sourse
26 {
27 A = 1,
28 B = 0M,
29 C = "2011/9/21 0:00:00",
30 D = new Inner
31 {
32 D2 = Guid.NewGuid()
33 },
34 E = "test"
35 };
36
37 ObjectsMapper<Sourse, Dest> mapper =
38 ObjectMapperManager.DefaultInstance.GetMapper<Sourse, Dest>();
39 Dest dst = mapper.Map(src);
40
41 Assert.AreEqual<string>(dst.B.ToString(), src.B);
42 Assert.AreEqual<long>(dst.C.C1, 0L);
43 Assert.AreEqual<Guid>(dst.C.C2, src.C.C2);
44 Assert.IsNull(dst.E);
   
  • 預設映射配置器
      預設的映射配置器能自動轉換以下幾種類型:任何類型到string類型使用ToString()方法;可以使用System.Convert類轉換的原始類型;可空類型、枚舉類型、各種集合類型、結構與類;複雜的巢狀型別採用遞迴方式轉換;       如果預設的轉換滿足不了需求,預設的映射配置器還允許指定命名規範,自訂建構函式,自訂轉換器,忽略成員等。     

支援的方法

描述

ConvertUsing

為指定的成員提供自訂的轉換邏輯

ConvertGeneric

為指定的泛型型別成員提供自訂的轉換邏輯

ConstructBy

為目標對象使用指定的建構函式替代預設建構函式

NullSubstitution

當來源物件中指定的成員在為null時,給目標對象的成員賦值

IgnoreMembers

忽略指定成員的映射

PostProcess

在映射完成後執行指定的方法

ShallowMap

指定的成員採用淺拷貝方式映射

DeepMap

指定的成員採用深拷貝方式映射

MatchMembers

如果成員名稱的映射不採用精確匹配,可以指定具體的映射邏輯

       選擇幾個方法簡單樣本如下:  
 1     public class Sourse
2 {
3 public int A;
4 public decimal? B;
5 public string C;
6 public Inner D;
7 public string E;
8 }
9
10 public class Dest
11 {
12 public int? A;
13 public decimal B;
14 public DateTime C;
15 public Inner2 D;
16 public string F;
17 }
18
19 public class Inner
20 {
21 public long D1;
22 public Guid D2;
23 }
24
25 public class Inner2
26 {
27 public long D12;
28 public Guid D22;
29 }
30
31 ObjectsMapper<Sourse, Dest> mapper1 =
32 new ObjectMapperManager().GetMapper<Sourse, Dest>(
33 new DefaultMapConfig()
34 .IgnoreMembers<Sourse, Dest>(new string[] { "A" })
35 .NullSubstitution<decimal?, decimal>((value) => -1M)
36 .ConvertUsing<Inner, Inner2>(value => new Inner2 { D12 = value.D1, D22 = value.D2 })
37 .PostProcess<Dest>((value, state) => { value.F = "nothing"; return value; })
38 );
39 Dest dst = mapper1.Map(src);
40
41 Assert.IsNull(dst.A);
42 Assert.AreEqual<decimal>(dst.B, -1M);
43 Assert.AreEqual<Guid>(dst.D.D22, src.D.D2);
44 Assert.AreEqual<string>(dst.F, "nothing");
    
  • 自訂映射配置器
      當然EmitMapper是個非常靈活的架構,也可以自訂映射配置器,實現定製的映射操作。      自訂的映射配置器可以繼承自DefaultMapConfig或CustomMapConfig,利用基類的一些功能實現定製的映射,也可以繼承自介面ImappingConfigurator,完全從頭實現。       比如可以實現從HTTP中通過Post方式提交的Form資料到具體業務實體類的映射,下面通過繼承ImappingConfigurator來實現。 自訂映射配置器  轉自 http://www.cnblogs.com/wuhong/archive/2011/09/21/2184313.html    

 

開源實體映射架構EmitMapper介紹

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.