我们为什么要在对象之间做映射
处于耦合性或者安全性考虑或者性能考虑我们不希望将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();