天天看點

ASP.NET Core實作對象自動映射-AgileMapper

我們為什麼要在對象之間做映射

處于耦合性或者安全性考慮或者性能考慮我們不希望将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<Customer>();
// Or:
var customer = customerViewModel.Map().ToANew<Customer>();
      

查詢映射

使用實體到另一個類型的使用

var customerVm = await dbContext
    .Customers
    .Project().To<CustomerViewModel>()
    .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.DateCreated将被忽略,因為OrderDto沒有比對到,但是Id屬性将被更新,這一塊可以停止更新

Mapper.WhenMapping
    .From<OrderDto>()   // 從OrderDto映射
    .To<Order>()        // 将忽略訂單建立更新合并
    .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<Address>()
    .If((o, a) => 
        string.IsNullOrWhiteSpace(a.Line1) || 
        string.IsNullOrWhiteSpace(a.Postcode))
    .MapToNull();
      

繼續閱讀