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