我們為什麼要在對象之間做映射
處于耦合性或者安全性考慮或者性能考慮我們不希望将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();