码迷,mamicode.com
首页 > 移动开发 > 详细

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

时间:2019-11-30 00:15:17      阅读:102      评论:0      收藏:0      [点我收藏+]

标签:smart   new   ESS   order   深度   person   mod   克隆   rto   

原文: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

标签:smart   new   ESS   order   深度   person   mod   克隆   rto   

原文地址:https://www.cnblogs.com/lonelyxmas/p/11960792.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!