首頁  >  文章  >  後端開發  >  介紹OOM中AutoMapper的使用方法

介紹OOM中AutoMapper的使用方法

Y2J
Y2J原創
2017-05-06 11:37:571640瀏覽

本文主要介紹了OOM框架AutoMapper的相關知識,這篇文章的五個實例可以幫你解決常見的基本問題。具有一定的參考價值,下面跟著小編一起來看下吧

寫在前面

#OOM顧名思義,Object-Object-Mapping實體間相互轉換,AutoMapper也是個老生常談了,其意義在於幫助你無需手動的轉換簡單而又麻煩的實體間關係,比如ViewModel和entity的轉換,SearchModel和Entity的轉換,我這篇分享的意義在於,網上大多數的分享都是幾年前的,很多方法已經被廢棄,到了編譯器裡會告訴你該方法已經過時,廢棄的,不建議使用的,比如Mapper.CreateMap等方法,當然老司機大多數直接就去github看文檔了,或者google一下就了解了,但中文資料關於方法廢棄後,並沒有什麼說明了。本篇的五個實例可以幫你解決常見的基本問題.

預備

#首先我們預備一些ViewModel和TModel。 ViewModel就是你和使用者互動的實體。 TModel就是你與資料庫打交道的實體。

實體展示如下:

TModel有以下三個簡單的實體,他們有獨立的實體,也有一對多的實體。

public class TAddress
{
 public string Country { get; set; }
 public string City { get; set; }
 public string Street { get; set; }
 public string PostCode { get; set; }
 public string CreateTime { get; set; }
 public int CreateUserId { get; set; }
}
public class TAuthor
 {
  public string Name { get; set; }
  public string Description { get; set; }
  public List<TContactInfo> ContactInfo { get; set; }
 }
 public class TContactInfo
 {
 public int Id { get; set; }
 public string Email { get; set; }
 public string Blog { get; set; }
 public string Twitter { get; set; }
 }

ViewModel如下三個:

public class VM_Address
 {
 public string Country { get; set; }
 public string City { get; set; }
 public string City2 { get; set; }
 }
 public class VM_Author
 {
 public string Name { get; set; }
 public string Description { get; set; }
 public List<VM_ContactInfo> ContactInfo { get; set; }
 }
 public class VM_ContactInfo
 {
 public int Id { get; set; }
 public string Email { get; set; }
 public string Blog { get; set; }
 public string Twitter { get; set; }
 }

單一實體轉換

單一實體轉換的時候,在屬性欄位名稱在完全符合的情況下,你只需指定兩個實體間的轉換規則,指定source來源實體和destination目標實體。那你應該參考以下實例:

VM_Address dto = new VM_Address
  {
  Country = "China",
  City = "Beijing"
  };
  Mapper.Initialize(m => m.CreateMap<VM_Address, TAddress>());
  TAddress address = Mapper.Map<VM_Address, TAddress>(dto);

請注意在AutoMapper5.x當中,Initialize來初始化你的規則是首選的。

在你指定轉換規則後,請使用Map方法,進行轉換並輸出你的目標實體。還有第一個參數代表SourceModel,第二個參數是DestinationModel.

單一實體不同名屬性轉換

當你需要對不同名稱的欄位來進行映射的時候,請注意使用ForMember方法,第一個參數需要你制定所需特殊配置的目標字段,第二個參數你則需要製定你對該字段屬性的操作,我選擇了它所提供的MapFrom方法,意義在於告訴AutoMapper,我需要講目標實體的City來源指定為來源實體的City2屬性值。

VM_Address dto = new VM_Address
  {
  Country = "China",
  City2 = "Beijing"
  };
  Mapper.Initialize(m => m.CreateMap<VM_Address, TAddress>().ForMember(x => x.City, opt => opt.MapFrom(o => o.City2)));
  TAddress address = Mapper.Map<VM_Address, TAddress>(dto);

集合轉換

在集合間轉換的時候,你不需要設定目標List與來源List物件中的匹配,而只需要配置你泛型物件的映射匹配關係。

  TAddress address = new TAddress { Country = "China", City = "Beijing" };
  TAddress address2 = new TAddress() { Country = "USA", City = "New York" };
  List<TAddress> addressList = new List<TAddress>() { address2, address };
  Mapper.Initialize(m => m.CreateMap<TAddress, VM_Address>());//这里仅需配置实体间的转换,而不是实体集合的转换
  List<VM_Address> res = Mapper.Map<List<TAddress>, List<VM_Address>>(addressList);

實體包含不同型別屬性轉換(忽略屬性)

在實體包含不同型別屬性的時候,像是TModel1包含了一個Listbc26e2d35896972142bded266172216c,你的ViewModel1包含了一個Listc3232db81f7d071f9370eef3d6b791a7.這個時候你可以選擇忽略這個屬性

 var contacts = new List<TContactInfo>() { new TContactInfo() 
          { Blog = "myblog", Email = "ws@qq.com" }, new TContactInfo() { Blog = "myblog", Email = "ll@qq.com" } };
  TAuthor author = new TAuthor() { Description = "描述", Name = "吴双", ContactInfo = contacts };
  Mapper.Initialize(m => { m.CreateMap<TAuthor, VM_Author>().ForMember(x => x.ContactInfo, opt => opt.Ignore()); });
       VM_Author dto = Mapper.Map<TAuthor, VM_Author>(author);
//这里的Ignore代表配置ContractInfo该属性的操作 为 忽略Ignore,映射时将忽略该属性 由于List<TContactInfo>()和List<VM_ContactInfo>() 是不同类型,所以需要配置忽略或者是特殊映射,特殊映射例子看下方

#實體包含不同型別屬性轉換(指定屬性Mapfrom)

#當然你需要這個屬性的時候,你可以不忽略他,而是使用MapFrom來進行特殊的指定,並且在類型不相同的時候,你要指定你兩個類型間的映射匹配關係。如同下面實例中的

m.CreateMap775d38cc2051b2bc0f39739d39ab1b82();和
m.CreateMap453162b02c806123692898c984a1fdf8().ForMember(x => x.ContactInfo, opt =>().ForMember(x => x.ContactInfo, opt => ; opt.MapFrom(o => o.ContactInfo));

var contacts = new List<TContactInfo>()
  {
  new TContactInfo() { Blog = "myblog", Email = "ws@qq.com" },
  new TContactInfo() { Blog = "myblog", Email = "ll@qq.com" }
  };
  TAuthor author = new TAuthor() { Description = "描述", Name = "吴双", ContactInfo = contacts };
  Mapper.Initialize(m =>
  {
  m.CreateMap<TContactInfo, VM_ContactInfo>();//注意 内部不同类型实体转换时必要的
  m.CreateMap<TAuthor, VM_Author>().ForMember(x => x.ContactInfo, opt => opt.MapFrom(o => o.ContactInfo));//注意 制定MapFrom是必要的
  });
  VM_Author dto = Mapper.Map<TAuthor, VM_Author>(author);

【相關推薦】

1. ASP免費影片教學

#2. ASP教學

3. 李炎恢ASP基礎影片教學

以上是介紹OOM中AutoMapper的使用方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn