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

Posted lonelyxmas

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ASP.NET Core实现对象自动映射-AgileMapper相关的知识,希望对你有一定的参考价值。

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

以上是关于ASP.NET Core实现对象自动映射-AgileMapper的主要内容,如果未能解决你的问题,请参考以下文章

automapper 自动映射 集成asp.net Core2.1

ASP.NET Core 中的对象映射之 AutoMapper

ASP.NET Core Web 应用程序系列- 在ASP.NET Core中使用AutoMapper进行实体映射

ASP.NET Core搭建多层网站架构6.2-使用AutoMapper映射实体对象

带有 EF Core 的 ASP.NET Core - DTO 集合映射

ASP.NET Core 中的 ORM 之 Dapper