標籤:
開源實體映射架構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介紹