如何在 .NetCore 中使用 AutoMapper 高级功能

.Net Core6.0 WebAPI项目框架搭建九:AutoMapper的使用 在Web.Core.Services项目中引用Nuget包,AutoMapper 和 AutoMapper.Extensions.Microsoft.DependencyInjection。AutoMapper是一种实体转换关系的模型,AutoMapper是一个.NET的对象映射工具。主要作用是进行领域对象与模型(DTO)之间的转换、数据库查询结果映射至实体对象。在Web.Core.Model下添加Dto文件夹,新建模型StudentDto.cs。 阅读详情

AutoMapper 是一个基于约定的面向对象的映射器,它的功能常用于将一个 input 对象 转成一个不同类型的 output 对象,input 和 output 对象之间的属性可能相同也可能不相同,这一篇我们来一起研究一下 AutoMapper 的一些高级玩法。

安装 AutoMapper

要想在项目中使用 AutoMapper ,需要通过 nuget 引用 AutoMapper 和 AutoMapper.Extensions.Microsoft.DependencyInjection 包,可以通过 Visual Studio 2019 的 NuGet package manager 可视化界面安装 或者 通过 NuGet package manager 命令行工具输入以下命令:

Install-Package AutoMapper
Install-Package AutoMapper.Extensions.Microsoft.DependencyInjection

配置 AutoMapper

一旦 AutoMapper 成功安装之后,接下来就可以将它引入到 ServiceCollection 容器中,如下代码所示:

public void ConfigureServices(IServiceCollection services)
{         
    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

    services.AddAutoMapper(typeof(AuthorProfile));
}

使用 profiles 统一管理 mapping 信息

可以使用 profiles 来统一组织你的 mapping 信息,要创建 profile,需要实现 AutoMapper 提供的 Profile 类,然后在你刚才创建的 Profile 子类的构造函数中添加映射信息,下面的代码展示了如何创建一个从 Proifle 继承的 AuthorProfile 类以及相关信息。

public class AuthorProfile : Profile
{
     public AuthorProfile()
     {
         CreateMap<AuthorModel, AuthorDTO>();
     }
}

接下来再看 AuthorModel 和 AuthorDTO 两个对象的定义:

public class AuthorModel
{
    public int Id
    {
        get; set;
    }
    public string FirstName
    {
        get;set;
    }
    public string LastName
    {
        get; set;
    }
    public string Address
    {
        get; set;
    }
}

public class AuthorDTO
{
    public int Id
    {
        get; set;
    }
    public string FirstName
    {
        get; set;
    }
    public string LastName
    {
        get; set;
    }
    public string Address
    {
        get; set;
    }

使用 ReverseMap()

值得注意的是,上面的示例是一种 单向流动,这是什么意思呢?举个例子吧,下面是 单向流动 的一段代码。

AutoMapper.Mapper.CreateMap<AuthorDTO, AuthorModel>();

有了这个 Map,接下来就可以轻松实现 AuthorDTO 到 AuthorModel 的转换,代码如下:

var authorModel = AutoMapper.Mapper.Map<AuthorModel>(author);

假设因为某种原因,你需要将 authorModel 实例反转成 authorDTO,这时你用了如下的代码段。

var author = AutoMapper.Mapper.Map<AuthorDTO>(authorModel);

很遗憾,这种方式注定会抛出异常,这是因为 AutoMapper 并不知道如何实现 authorModel 到 authorDTO 的转换,毕竟你没有定义此种 map 的映射流向,那怎么解决呢?可以再定义一个 CreateMap 映射哈,其实没必要,简单粗暴的做法就是调用 ReverseMap 即可,实现代码如下:

AutoMapper.Mapper.CreateMap<AuthorDTO, AuthorModel>().ReverseMap();

使用 ForMember() 和 MapFrom()

这一节我们继续使用之前说到的 AuthorModel 和 AuthorDTO 类,下面的代码片段展示了如何将 AuthorModel 转成 AuthorDTO 。

var author = new AuthorModel();           
author.Id = 1;
author.FirstName = "Joydip";
author.LastName = "Kanjilal";
author.Address = "Hyderabad";
var authorDTO = _mapper.Map<AuthorDTO>(author);

现在假设我将 AuthorModel 中的 Address 改成 Address1,如下代码所示:

   public class AuthorModel
   {
       public int Id
       {
           get; set;
       }
       public string FirstName
       {
           get; set;
       }
       public string LastName
       {
           get; set;
       }
       public string Address1
       {
           get; set;
       }
   }

然后在 AuthorProfile 中更新一下 mapping 信息,如下代码所示:

public class AuthorProfile : Profile
{
    public AuthorProfile()
    {
        CreateMap<AuthorModel, AuthorDTO>().ForMember(destination => destination.Address, map => map.MapFrom(source => source.Address1));
    }
}

使用 NullSubstitute

何为 NullSubstitute 呢?大意就是在映射转换的过程中,将input 为null 的属性映射之后做自定义处理,比如在 ouput 中改成 No Data,下面的代码展示了如何去实现。

AutoMapper.Mapper.CreateMap<AuthorModel, AuthorDTO>().ForMember(destination => destination.Address, opt => opt.NullSubstitute("No data"));

mapping 的 AOP 拦截

考虑下面的两个类。

  public class OrderModel
  {
    public int Id { get; set; }
    public string ItemCode { get; set; }
    public int NumberOfItems { get; set; }
  }

  public class OrderDTO
  {
    public int Id { get; set; }
    public string ItemCode { get; set; }
    public int NumberOfItems { get; set; }
  }

可以使用 BeforeMap() 在 源对象 或者 目标对象 上执行一些计算或者初始化成员操作,下面的代码展示了如何去实现。

Mapper.Initialize(cfg => {
  cfg.CreateMap().BeforeMap((src, dest) => src.NumberOfItems = 0)
});

当 mapping 执行完之后,可以在 目标对象 上 安插 AfterMap() 方法,下面的代码展示了如何去实现。

public OrderDTO MapAuthor(IMapper mapper, OrderDTO orderDTO)
{
    return mapper.Map<OrderModel, OrderDTO>(orderDTO, opt =>
    {
        opt.AfterMap((src, dest) =>
        {
            dest.NumberOfItems = _orderService.GetTotalItems(src);
       });
    });
}

使用嵌套映射

AutoMapper 同样也可以使用嵌套映射,考虑下面的 domain 类。

public class Order
{
    public string OrderNumber { get; set; }
    public IEnumerable<OrderItem> OrderItems { get; set; }
}

public class OrderItem
{
    public string ItemName { get; set; }
    public decimal ItemPrice { get; set; }
    public int ItemQuantity { get; set; }
}

接下来再看一下 DTO 类。

public class OrderDto
{
    public string OrderNumber { get; set; }
    public IEnumerable<OrderItemDto> OrderItems { get; set; }
}

public class OrderItemDto
{
    public string ItemName { get; set; }
    public decimal ItemPrice { get; set; }
    public int ItemQuantity { get; set; }
}

最后看看如何在转换的过程中使用 mapping 的。

var orders = _repository.GetOrders();
Mapper.CreateMap<Order, OrderDto>();
Mapper.CreateMap<OrderItem, OrderItemDto>();
var model = Mapper.Map<IEnumerable<Order>, IEnumerable<OrderDto>>(orders);

AutoMapper 让你用最小化的配置实现了对象之间的映射,同时也可以实现自定义的解析器来实现具有完全不同结构对象之间的映射,自定义解析器可以生成与目标对象具有相同结构的exchange,以便AutoMapper在运行时可以据其实现映射。

ENVI5.6+SARscape实战:基于哨兵一号的PS与SBAS时序InSAR地表形变监测全流程解析 本文详细解析了使用ENVI5.6和SARscape软件基于哨兵一号数据进行PS与SBAS时序InSAR地表形变监测的全流程。从数据获取、预处理到PS-InSAR和SBAS-InSAR处理,提供了实用技巧和优化建议,帮助用户高效完成地表形变监测任务。 阅读详情

相关推荐

机械拆装-基于Unity-总体设计

建立一个机械装配的场景

唐小墨同学的博客 2774

.NetCore之AutoMapper进阶篇

.NetCore之AutoMapper进阶篇

一代枭雄_宗某的博客 1145

OpenEuler22.04 快速部署Docker:华为云镜像源配置指南

本文详细介绍了在OpenEuler 22.04系统上快速部署Docker的完整流程。针对系统默认源版本老旧的问题,重点讲解了如何配置华为云镜像源以加速安装,并涵盖Docker引擎、Docker Compose的安装、服务启动验证、权限配置、镜像加速等核心步骤与常见问题排查,帮助用户高效搭建稳定的容器化开发环境。

http9protocoller的博客 173

.net core AutoMapper的简单使用。

AutoMapper主要处理对象与对象之间的映射,减少程序员自己编写代码的工作量,提高开发效率。假如你想对原始数据,进行部分字段展示,那么你需要创建一个对应的DTO类,进行手动映射,这样太麻烦。所以可以采用自动映射。

csdn2990的博客 1716

RP Fiber Power 版本

RP Fiber Power的版本历史 该软件一直受到多年来广泛的发展计划,这大大扩展了其功能,以及用户界面的质量。 V1 这是第1个版本。 它仅限于光纤激光器和放大器的连续波计算,并且只能通过脚本进行控制。 V2 版本2引入了交互式表单。 至少对于更简单的模拟,现在可以简单地通过填写表单来工作,而V1必须通过脚本来控制。 例如,屏幕截图显示了输入某些信号参数的表单: 当您基于这些表单执行计算时,程序将根据您的表单输入自动编写脚本文件,然后执行该脚本。如果您需要编写脚本以获得更大的灵活性,可以稍后查看该脚

Asdmath的博客 2428

实战分享:如何用本地替换和插桩调试搞定Kasada最新版x-kpsdk-cd环境检测

本文深入解析Kasada最新版x-kpsdk-cd环境检测机制,提供动态请求拦截、本地替换和函数插桩等实战调试策略。通过Proxy保护破解、关键函数断点调试和环境检测对抗方案,帮助逆向工程师有效应对从280位扩展到294位的加密数组挑战,实现高效补环境调试。

weixin_29251567的博客 568

.net core使用AutoMapper

AutoMapper 是一个用于 .NET 平台的对象映射工具,它简化了不同对象类型之间的转换过程。在软件开发中,尤其是在分层架构的应用程序里,常常需要在不同的对象模型之间进行数据传递,例如从数据库实体到视图模型、DTO(数据传输对象)或业务逻辑层的模型等。手动编写这些转换代码不仅繁琐而且容易出错,而 AutoMapper 可以自动化这个过程,提高开发效率和代码质量。

金石软件 1532

使用python实现随机正态分布数据,并导出到表格(超详细)

最近需要大量的正态分布的数据,为了方便,使用python实现随机正态分布,画出理想正态分布图和实际的矩形分布,并导出到表格里面。以上就是今天要讲的内容,本文仅仅简单介绍了使用python随机生成正态分布的数据,画图,并导出。正态分布是机器学习中很常见的一种需求,往往需要大量的数据进行测试,此时,本文的方法就可以大大减少因数据而花费的时间啦!如有问题,欢迎评论区留言啊!

m0_53533553的博客 1万+

ASP.NET Core 集成 AutoMapper 的介绍和实际开发应用

AutoMapper是一个对象-对象映射器(OOM),它主要用于在.NET应用程序中实现对象之间的自动转换。在ASP.NET Core项目中,AutoMapper特别有用,因为它可以极大地减少手动编写映射代码的工作量,从而提高开发效率。AutoMapper的工作原理是通过配置源对象和目标对象之间的映射关系,然后自动执行这些映射。这意味着,当源对象的数据发生变化时,AutoMapper可以自动将这些变化应用到目标对象上,而无需手动编写代码来更新目标对象。

战族狼魂的博客 1674

Shader Graph入门

Shader Graph 简介

zaizai1007的博客 1万+

OpenClaw插件配置错误修复完全指南

插件文件名是插件目录结构正确package.json配置正确OpenClaw的插件系统还在快速迭代,偶尔会遇到这种配置问题。看错误信息检查配置文件检查实际文件对比差异修复问题大部分问题都能解决。查看官方文档:https://openclaw.ai/docs提Issue:https://github.com/openclaw/openclaw/issues加入Discord社区求助快速修复命令汇总。

Maynor的博客 4090

AutoMapper 在NetCore8 中实践

AutoMapper简要

毫无遗憾的帅哥 1012

Python进阶005:修改Jupyter Notebook的工作路径

1、Jupyter Notebook简介 2、修改Jupyter Notebook的工作路径 如下三个步骤: 一、安装notebook 在CMD命令行中输入: pip install notebook 二、启动notebook jupyter notebook 启动后发现是在你的用户目录下,如下图所示,但是该目录下有很多的其他文件或文件夹,因此我想把这个环境切换到我单门创建的一个文件夹中。 三、创建notebook的配置文件 在CMD命令行中执行: jupyter notebook --genera

若北辰 1384

.NetCore——AutoMapper基本使用

.NetCore——AutoMapper基本使用 一、介绍 官网解释: AutoMapper是一个对象-对象映射器。对象-对象映射通过将一种类型的输入对象转换为另一种类型的输出对象来工作。 使AutoMapper变得有趣的是,它提供了一些有趣的约定,以免去搞清楚如何将类型A映射为类型B。只要类型B遵循AutoMapper既定的约定,就需要几乎零配置来映射两个类型。简单来说就是偷懒用的。 官网地址:https://docs.automapper.org/en/stable/Getting-started.ht

qiaofan_乔凡的博客 1453

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

AutoMapper在asp.netcore中的使用

automapper 是.net 项目中针对模型之间转换映射的一个很好用的工具,不仅提高了开发的效率还使代码更加简洁,当然也是开源的,https://github.com/AutoMapper,这不多做介绍,详细看,官网下面是介绍它在 .net core 项目中的使用  1. 首先当然先引用 AutoMapper    - 你可以在NuGet中直接输入AutoMapper直接引用,也可以在控制

dotNET跨平台 4631

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

netcore使用AutoMapper

说明:以下是使用过程中看到的其他博主写的,地址如下: 地址一:https://cloud.tencent.com/developer/article/1395155 地址二:https://www.cnblogs.com/yanwuming/p/9609887.html 我的项目是netcore SDK2.2版本,开发软件vs2017; 首先告诉大家,很不幸的是:上面两种方法都试过了,但是...

weixin_30508309的博客 327

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

NetCore+AutoMapper多个对象映射到一个Dto对象

NetCore+AutoMapper多个对象映射到一个Dto对象 原文:NetCore+AutoMapper多个对象映射到一个Dto对象 目录 一、定义源映射类和被映射类DTO 二、注入AutoMapper 三、配置映射 四、调用AutoMa...

weixin_30642267的博客 966

.net core中使用Automapper

安装所需的包 Install-Package AutoMapper.Extensions.Microsoft.DependencyInjection 配置AutoMapper public void ConfigureServices(IServiceCollection services) { services.AddMvc().SetCompatibilityVersion(Com...

Jonny的博客 4315

C# NetCore AutoMapper 忽略大量自动映射属性

在上一篇文章中【C# NetCore AutoMapper 忽略映射属性】,在创建映射时,我添加了FormMember方法,以便在进行映射时忽略Name属性。如果查看输出窗口,可以看到Name的值为空,即使源实例中的属性中有值。 如果我们想忽略大量自动映射的属性,这将是一个繁琐的过程。因此,如果遇到这种情况,请考虑创建一个类似下面的扩展类,它会忽略基于模型中指定的数据属性的属性。 完整示例: using System; using AutoMapper; using System.Component

csdn_aspnet的专栏,请点击博客主页右上角三个点中的私信联系 9万+

NetCore3.1——AutoMapper配置

1,Model层配置 using AutoMapper; using Sthxn.Model.Test; namespace Sthxn.Model.Dto.Config { public class MapperConfig : Profile { public MapperConfig() { CreateMap<AutoMapperModel, AutoMapperDto>().ReverseMap();

博客 508

netcore中简单使用AutoMapper

netcore中简单使用AutoMapper 1.倒入AutoMapper包 在nuget包管理器中添加如下包 2.在startup中进行服务注册 3.创建profile文件和映射类 4.创建映射规则 导入命名空间using AutoMapper; 5.TouristRoute和TouristRouteDto类 public class TouristRouteDto { public Guid Id { get; set; } public string

世界既不黑也不白,而是一道精致的灰。 471

.NET Core 中AutoMapper的配置及使用

一、AutoMapper说明 1.AutoMapper是一个对象-对象映射器。对象-对象映射通过将一种类型的输入对象转换为另一种类型的输出对象来工作。 二、.NET Core中配置AutoMapper 1.NuGet安装AutoMapper.Extensions.Microsoft.DependencyInjection 2.创建配置文件,并添加映射配置 需要继承AutoMapper中的Profi...

预立数据科技 2874

C# AutoMapper

} }} } }} } }} } }在上面的示例中,我们创建了一个类,并在其中定义了到的映射规则。} } }} } }} } }} } }在上面的示例中,我们使用了方法来为所有成员应用相同的映射策略。方法使用了反射来动态获取对象的属性值。

标准都是留给不爱的人,爱的本质是自由意志的沉沦 1357

Asp.NetCore之AutoMapper基础篇

Asp.NetCore之AutoMapper基础篇

一代枭雄_宗某的博客 931

.Net Core AutoMapper自定义扩展方法的使用

上次我们讲了如何在.Net Core下使用AutoMapper,我们采用的是AutoMapper 9.0。上次的方法如下 var dto = _mapper.Map<sys_user, sys_userDto>(q);//_mapper.Map<sys_userDto>(q); 这样也能用,但这样代码好像麻烦了点,我们现在可以自己定义一个AutoMapperHelpe...

飞翔的学习笔记 1728

C# NetCore AutoMapper 忽略映射属性

在这篇文章中,我将向你展示如何通过AutoMapper自动映射来忽略属性。假设源和目标都有一个同名的属性,但用于表示不同的信息,那么我们肯定不希望自动映射该属性。我们可以在AutoMapper中创建映射时进行如下配置。 var config = new MapperConfiguration(cfg => { cfg.CreateMap<Source, Destination>().ForMember(x =>x.DestinationPropertyName, opt

csdn_aspnet的专栏,请点击博客主页右上角三个点中的私信联系 9万+
上一篇: 人活一辈子,到底为了什么而工作?这是我看过最好的答案
下一篇: redis之hash源码分析
.NET跨平台
博客等级 码龄15年 6066粉丝 738原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值