五段階マスターOOMフレームAutoMapper基本使用

5730 ワード

前に書く
OOMは名前の通り、Object-Object-Mappingエンティティ間の相互変換、AutoMapperもありふれた話です。その意味は、手動での変換が必要ではなく、簡単で面倒な実体間関係、例えばView Modelとentityの転換、Search ModelとEntityの転換を助けます。多くの方法はすでに廃棄されました。コンパイラに行くと、この方法はもう古いです。廃棄されたもの、例えばMapper.reate Mapなどの方法は勧められません。もちろんベテランドライバーは直接にgithubに文書を見に行きます。あるいはgoogleはすぐに分かりますが、中国語の資料は方法が廃棄された後、何の説明もありません。この篇の5つの例はよくある基本的な問題を解決してくれます。
予備
まず、View ModelとTModelを用意します。View Modelはあなたとユーザーが相互作用するエンティティです。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; }
 }
View Modelは以下の三つです。

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; }
 }
単一エンティティ変換
個々のエンティティが変換される場合、属性フィールド名が完全に一致する場合、二つのエンティティ間の変換規則を指定し、ソースエンティティと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);
AutoMapper 5.0 xの中でInitializeがあなたのルールを初期化するのが一番いいです。
変換ルールを指定したら、Mapメソッドを使って変換して出力してください。また、最初のパラメータはSourceModelを表し、二つ目のパラメータはDestination Modelです。
単一のエンティティは同じ名前の属性に変換されません。
異なる名前のフィールドをマッピングする必要がある場合は、ForMemberメソッドを使用してください。最初のパラメータは特別な設定が必要なターゲットフィールドを作成してください。二つ目のパラメータはこのフィールドの属性を設定する操作が必要です。AutoMapperに対して提供するMapFrom方法を選択しました。ターゲットエンティティのCityソースをソースエンティティのCity 2属性値に指定したいです。

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);
エンティティは、異なるタイプの属性変換(属性を無視)を含む。
本体に異なるタイプの属性が含まれている場合、例えばTModel 1にList<TModel>が含まれています。そして、あなたのView Model 1にはList<View Model>が含まれています。この属性は無視できます。

 var contacts = new List<TContactInfo>() { new TContactInfo() 
          { Blog = "myblog", Email = "[email protected]" }, new TContactInfo() { Blog = "myblog", Email = "[email protected]" } };
  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を使って特別な指定をしてもいいです。また、タイプが異なる場合は、あなたの2つのタイプのマッピングマッチング関係を指定します。次の例のように
m.C.reat Map<TContactInfo、VM_Contect Info>()和
m.C.reat Map<TAuthor、VM_Author>().ForMember(x=>X.ContactInfo,opt=>opt.MapFrom(o=>o.contactInfo);

var contacts = new List<TContactInfo>()
  {
  new TContactInfo() { Blog = "myblog", Email = "[email protected]" },
  new TContactInfo() { Blog = "myblog", Email = "[email protected]" }
  };
  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);
最後に書く
エンティティ変換において、AutoMapperの必要性と実用性はすでに一望できました。
以上が本文の全部です。本文の内容は皆さんの学習や仕事に一定の助けをもたらしてくれると同時に、私達を応援してください。