我們為什麼要在對象之間做映射 處於耦合性或者安全性考慮或者性能考慮我們不希望將Model模型傳遞給他們,我們會在項目中創建一些DTO(Data transfer object數據傳輸對象),進行數據的傳輸. 概述 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();