ホームページ  >  記事  >  バックエンド開発  >  OOM フレームワーク AutoMapper の使用例をマスターします。

OOM フレームワーク AutoMapper の使用例をマスターします。

零下一度
零下一度オリジナル
2017-07-03 17:19:101626ブラウズ

この記事では、主に OOMframeworkAutoMapper の関連知識を紹介します。この記事の 5 つの例は、一般的な基本的な問題の解決に役立ちます。一定の参考値があるので、下のエディタで見てみましょう

前に書いてあります

OOM 名前が示すように、Object-Object-Mapping エンティティも相互に変換されます。 ViewModel と Entity 間の変換、SearchModel と Entity 間の変換など、エンティティ間の単純で面倒な関係を手動で変換する必要がないのが、私の共有の意義です。インターネット上で共有されるようになったのは数年前であり、多くのメソッドが廃止されています。コンパイラは、Mapper.CreateMap やその他のメソッドなど、そのメソッドは時代遅れであり、使用することが推奨されていないことを通知します。ほとんどの経験豊富なドライバーは、github に直接アクセスしてドキュメントを読むか、グーグルで検索して理解するでしょう。しかし、中国の情報には、放棄された後の方法についての説明がありません。この記事の 5 つの例は、一般的な基本的な問題を解決するのに役立ちます。

準備

まず、いくつかの ViewModel と TModel を準備します。 ViewModel は、ユーザーと対話するエンティティです。 TModel は、データベースを処理するために使用するエンティティです。

エンティティは次のように表示されます。

TModel には次の 3 つの単純なエンティティがあり、独立したエンティティと 1 対多のエンティティがあります。


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; }
 }

単一エンティティの変換

単一エンティティを変換する場合、属性フィールド名が正確に一致する場合、Conversionを指定するだけで済みますソース エンティティと宛先エンティティを指定する、2 つのエンティティ間のルール。次に、次の例を参照してください:


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 を表し、2 番目のパラメーターは DestinationModel です。

単一エンティティの異なる名前を持つ属性の変換

異なる名前のフィールドをマップする必要がある場合は、ForMember メソッドの使用に注意してください。最初のパラメータでは、特別な構成を必要とするターゲット フィールドを指定する必要があります。2 番目のパラメータでは、提供される MapFrom メソッドを選択しました。これは、AutoMapper に市を知る必要があることを伝えるためです。ターゲット エンティティは、ソース エンティティの 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 を使用します。型が異なる場合は、2 つの型間のマッピング一致関係を指定する必要があります。以下の例のように、

m.CreateMap775d38cc2051b2bc0f39739d39ab1b82(); および
m.CreateMap453162b02c806123692898c984a1fdf8().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);

最後に書きました

エンティティ変換では、AutoMapper の必要性と実用性が明確にわかりました。

以上がOOM フレームワーク AutoMapper の使用例をマスターします。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。