ASP.NET Core実装オブジェクト自動マッピング-AGileMapper

2879 ワード

なぜオブジェクト間でマッピングするのか
結合性あるいは安全性の考慮あるいは性能の考慮にあって私達はModel模型を彼らに伝達することを望んでいないで、私達はプロジェクトの中でいくつかDTO(Data transfer objectデータの伝送の対象)を作成して、データの伝送を行います.
概要
AgileMapperはゼロ構成で、高度に構成可能なオブジェクト-オブジェクトマッパであり、表示可能な実行計画を有し、目標は.NET Standard 1.0+と.NET 3.5+.クエリーマッピング、オブジェクト作成、深度クローン、idセンシングの更新とマージを実行し、拡張方法、静的API、またはインスタンスAPIで使用することができる.
クイックスタート
NuGetによるAgileMapperのインストール
PM> Install-Package AgileObjects.AgileMapper

 
基本的な使い方
オブジェクトの作成
次の方法で別のオブジェクトを作成します.
var customer = Mapper.Map(customerViewModel).ToANew();
// Or:
var customer = customerViewModel.Map().ToANew();

クエリー・マッピング
エンティティから別のタイプへの使用
var customerVm = await dbContext
    .Customers
    .Project().To()
    .FirstAsync(c => c.Id == customerId);

深度クローン
var clonedCustomer = Mapper.DeepClone(customerToBeCloned);
// Or:
var clonedCustomer = customerToBeCloned.DeepClone();

更新
コマンドを使用して、オブジェクトのメンバーと別の値を更新します.
Mapper.Map(customerSaveRequest).Over(customer);
// Or:
customerSaveRequest.Map().Over(customer);

結合
次の方法を使用して、オブジェクトの未入力メンバーを別の値にマージします.
Mapper.Map(customerDto).OnTo(customer);
// Or:
customerDto.Map().OnTo(customer);

メンバーを無視
ターゲットメンバーが一致するかどうかは、互換性のあるソースメンバーではデフォルトで無視されますが、マッパに無視するように伝えることもできます.
public class OrderDto
{
    public int Id { get; set; }
}

public class Order
{
    public int? Id { get; set; }
    public DateTime DateCreated { get; set; }
}

Order.OrderDtoが一致しないため、DateCreatedは無視されますが、Idプロパティは更新され、更新を停止できます.
Mapper.WhenMapping
    .From()   //  OrderDto  
    .To()        //            
    .Ignore(o => o.Id); //    Id  

複数のフィールドを無視し、無視条件を設定
Mapper
    .Map(orderDto).Over(order, cfg => cfg
        .If((dto, o) => dto.Id == 0) //    OrderDto.Id 0
        .Ignore(
            o => o.Id,
            o => o.DateCreated);     //   Id DateCreated

空の結果
ターゲットクラスメンバーが一致しない場合はnullにマッピングできます.
例:
var source = new { Name = "Frank" };
var target = new Person { Name = "Charlie", Address = default(Address) };
Mapper.Map(source).Over(target);

複雑なタイプを構成nullを返してインスタンス化しない
Mapper.WhenMapping
    .ToANew
() .If((o, a) => string.IsNullOrWhiteSpace(a.Line1) || string.IsNullOrWhiteSpace(a.Postcode)) .MapToNull();