原文: 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
基本用法
对象创建
使用以下方法从另一个创建对象
?1 2 3 | var customer = Mapper.Map(customerViewModel).ToANew<Customer>(); // Or: var customer = customerViewModel.Map().ToANew<Customer>(); |
查询映射
使用实体到另一个类型的使用
?1 2 3 4 | var customerVm = await dbContext .Customers .Project().To<CustomerViewModel>() .FirstAsync(c => c.Id == customerId); |
深度克隆
?1 2 3 | var clonedCustomer = Mapper.DeepClone(customerToBeCloned); // Or: var clonedCustomer = customerToBeCloned.DeepClone(); |
更新
使用一下命令更新对象的成员与另一个值
?1 2 3 | Mapper.Map(customerSaveRequest).Over(customer); // Or: customerSaveRequest.Map().Over(customer); |
合并
使用以下方法将对象未填充成员与另一个的值合并
?1 2 3 | Mapper.Map(customerDto).OnTo(customer); // Or: customerDto.Map().OnTo(customer); |
忽略成员
其中有没有目标成员匹配,兼容源成员默认情况下忽略,但你也可以告诉映射器忽略他.
?01 02 03 04 05 06 07 08 09 10 | 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属性将被更新,这一块可以停止更新
?1 2 3 4 | Mapper.WhenMapping .From<OrderDto>() // 从OrderDto映射 .To<Order>() // 将忽略订单创建更新合并 .Ignore(o => o.Id); // 忽略了Id属性 |
忽略多个字段,并且成立忽略条件
?1 2 3 4 5 6 | 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
例如:
?1 2 3 | var source = new { Name = "Frank" }; var target = new Person { Name = "Charlie" , Address = default (Address) }; Mapper.Map(source).Over(target); |
配置复杂类型返回null不进行实例化
?1 2 3 4 5 6 | Mapper.WhenMapping .ToANew<Address>() .If((o, a) => string .IsNullOrWhiteSpace(a.Line1) || string .IsNullOrWhiteSpace(a.Postcode)) .MapToNull(); |