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();


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM