前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ASP.NET Core实现对象自动映射-AgileMapper

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

原创
作者头像
HueiFeng
修改2020-02-12 14:48:16
1.2K0
修改2020-02-12 14:48:16
举报
文章被收录于专栏:HueiFeng技术专栏HueiFeng技术专栏

我们为什么要在对象之间做映射

处于耦合性或者安全性考虑或者性能考虑我们不希望将Model模型传递给他们,我们会在项目中创建一些DTO(Data transfer object数据传输对象),进行数据的传输.

概述

AgileMapper是一个零配置、高度可配置的对象-对象映射器,具有可查看的执行计划,目标是.NET Standard 1.0+和.NET 3.5+.他执行查询映射、对象创建、深度克隆、id感知更新和合并,可以通过扩展方法、静态API或实例API使用.

快速开始

通过NuGet安装AgileMapper

代码语言:javascript
复制
PM> Install-Package AgileObjects.AgileMapper

基本用法

对象创建

  使用以下方法从另一个创建对象

代码语言:javascript
复制
var customer = Mapper.Map(customerViewModel).ToANew<Customer>();
// Or:
var customer = customerViewModel.Map().ToANew<Customer>();

查询映射

使用实体到另一个类型的使用

代码语言:javascript
复制
var customerVm = await dbContext
    .Customers
    .Project().To<CustomerViewModel>()
    .FirstAsync(c => c.Id == customerId);

深度克隆

代码语言:javascript
复制
var clonedCustomer = Mapper.DeepClone(customerToBeCloned);
// Or:
var clonedCustomer = customerToBeCloned.DeepClone();

更新

使用一下命令更新对象的成员与另一个值

代码语言:javascript
复制
Mapper.Map(customerSaveRequest).Over(customer);
// Or:
customerSaveRequest.Map().Over(customer);

合并

使用以下方法将对象未填充成员与另一个的值合并

代码语言:javascript
复制
Mapper.Map(customerDto).OnTo(customer);
// Or:
customerDto.Map().OnTo(customer);

忽略成员

其中有没有目标成员匹配,兼容源成员默认情况下忽略,但你也可以告诉映射器忽略他.

代码语言:javascript
复制
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属性将被更新,这一块可以停止更新

代码语言:javascript
复制
Mapper.WhenMapping
    .From<OrderDto>()   // 从OrderDto映射
    .To<Order>()        // 将忽略订单创建更新合并
    .Ignore(o => o.Id); // 忽略了Id属性

忽略多个字段,并且成立忽略条件

代码语言:javascript
复制
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

例如:

代码语言:javascript
复制
var source = new { Name = "Frank" };
var target = new Person { Name = "Charlie", Address = default(Address) };
Mapper.Map(source).Over(target);

配置复杂类型返回null不进行实例化

代码语言:javascript
复制
Mapper.WhenMapping
    .ToANew<Address>()
    .If((o, a) => 
        string.IsNullOrWhiteSpace(a.Line1) || 
        string.IsNullOrWhiteSpace(a.Postcode))
    .MapToNull();

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档