• 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

    基本用法

    对象创建

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

    var customer = Mapper.Map(customerViewModel).ToANew<Customer>();
    // Or:
    var customer = customerViewModel.Map().ToANew<Customer>();
    

    查询映射

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

    var customerVm = await dbContext
        .Customers
        .Project().To<CustomerViewModel>()
        .FirstAsync(c => c.Id == customerId);
    

    深度克隆

    var clonedCustomer = Mapper.DeepClone(customerToBeCloned);
    // Or:
    var clonedCustomer = customerToBeCloned.DeepClone();
    

    更新

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

    Mapper.Map(customerSaveRequest).Over(customer);
    // Or:
    customerSaveRequest.Map().Over(customer);
    

    合并

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

    Mapper.Map(customerDto).OnTo(customer);
    // Or:
    customerDto.Map().OnTo(customer);
    

    忽略成员

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

    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属性将被更新,这一块可以停止更新

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

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

    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

    例如:

    var source = new { Name = "Frank" };
    var target = new Person { Name = "Charlie", Address = default(Address) };
    Mapper.Map(source).Over(target);
    

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

    Mapper.WhenMapping
        .ToANew<Address>()
        .If((o, a) => 
            string.IsNullOrWhiteSpace(a.Line1) || 
            string.IsNullOrWhiteSpace(a.Postcode))
        .MapToNull();
    
  • 相关阅读:
    Set.prototype (Set) – JavaScript 中文开发手册
    wordpress插件 : 利用Max Mega Menu实现二级菜单的伸缩
    HTML textarea placeholder 属性
    Number.parseInt (Number) – JavaScript 中文开发手册
    Java 实例 – 获取 URL响应头的日期信息
    PHP date_default_timezone_set() 函数
    SIMD.fromInt32x4Bits (SIMD) – JavaScript 中文开发手册
    使用 mysql_random_data_load 生成随机数据
    python基本数据类型
    day02代码
  • 原文地址:https://www.cnblogs.com/yyfh/p/11438500.html
Copyright © 2020-2023  润新知