ASP.NET Core实现对象自动映射-AgileMapper

时间:2022-01-07 06:38:20

原文: 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();