asp.net core webapi AutoMapper使用

1.AutoMapper介绍:

AutoMapper是一个.NET库,用于简化对象之间的映射。它可以帮助开发人员在不同类型之间进行自动转换,从而减少重复的手动映射代码。

使用AutoMapper,开发人员可以定义映射规则,然后该库会自动执行对象之间的映射。这使得在应用程序中对数据进行转换和映射变得更加简单和高效。

下面是AutoMapper的一些常见功能:

  1. 对象到对象的映射:简化了从一个对象类型到另一个对象类型的转换。

  2. 集合的映射:可以自动映射集合中的对象,减少了手动迭代和映射的工作。

  3. 可配置的映射规则:开发人员可以定义自定义的映射规则,以满足特定的需求。

  4. 灵活的映射选项:AutoMapper提供了许多选项和配置,以满足各种映射需求。

总的来说,AutoMapper是一个非常有用的库,可以帮助.NET开发人员简化对象之间的映射工作,提高代码的可读性和可维护性。

2.使用

2.1安装automapper nuget包

<PackageReference Include="AutoMapper" Version="12.0.1" />
<PackageReference Include="AutoMapper.Extensions.Microsoft.DependencyInjection" Version="12.0.1" />

2.2 创建对应的实体和dto

namespace webapi.Data
{public class City{public int Id { get; set; }public string CityName { get; set; }public Area area { get; set; }}public class Area{public int AreaId { get; set; }public string AreaName { get; set; }}public class CityDto{public int Id { get; set; }public string CityName { get; set; }public AreaDto area { get; set; }}public class AreaDto{public int AreaId1 { get; set; }public string AreaName1 { get; set; }}//------------//public class City1{public int Id { get; set; }public string CityName { get; set; }public List<Area> area { get; set; }}public class AreaDtos{public int AreaId { get; set; }public string AreaName { get; set; }}public class CityDto1{public int Id { get; set; }public string CityName { get; set; }public List<AreaDtos> area { get; set; }}//------//public class People{public string T_Name { get; set; }public int T_Age { get; set; }public string Address_tb1 { get; set; }public string sex_tb1 { get; set; }}public class ChildDto{public string Name { get; set; }public int Age { get; set; }public string Address { get; set; }public string sex { get; set; }}
}namespace webapi.Data
{public class Stu{public int Id { get; set; }public string Name { get; set; }public string Address { get; set; }public string NickName { get; set; }public bool Sex { get; set; }}public class Stu1{public int No { get; set; }public string Name { get; set; }public string Address { get; set; }public string NickName { get; set; }public bool Sex { get; set; }}public class Stu2{public int Id { get; set; }public string Name { get; set; }public string Address { get; set; }//[JsonIgnore]public string NickName { get; set; }public bool Sex { get; set; }}
}
namespace webapi.Data
{public class StuDto{public int Id { get; set; }public string Name { get; set; }public string Address { get; set; }public string NickName { get; set; }public bool Sex { get; set; }}public class StuDto1{public int Id { get; set; }public string Name { get; set; }public string Address { get; set; }public string NickName { get; set; }public string Sex { get; set; }}public class StuDto2{public int Id { get; set; }public string Name { get; set; }public string Address { get; set; }public string NickName { get; set; }public bool Sex { get; set; }}
}

2.3 创建配置类

using AutoMapper;
using webapi.Data;namespace webapi.Mapping
{/// <summary>/// 对象映射/// </summary>public class CustomProfile : Profile{public CustomProfile(){//实体转DTOCreateMap<Stu, StuDto>();//DTO转实体CreateMap<StuDto, Stu>();//实体转dto字段名不相同 stu1是No studto 是Id//stuDto的Id和Stu1的No字段进行映射CreateMap<Stu1, StuDto>().ForMember(x => x.Id, p => p.MapFrom(p => p.No));//实体转DTO,数据内容进行转换 Stu2 性别是 1和0 转成 StuDto1 中的男和女CreateMap<Stu1, StuDto1>().ForMember(x => x.Sex, p => p.MapFrom(p => p.Sex == true ? "男" : "女"));//忽略字段//Dto转实体忽略IdCreateMap<StuDto2, Stu2>().ForMember(x => x.Id, p => p.Ignore());//实体嵌套实体映射dtoCreateMap<City, CityDto>();CreateMap<Area, AreaDto>().ForMember(x => x.AreaId1, p => p.MapFrom(p => p.AreaId)).ForMember(x => x.AreaName1, p => p.MapFrom(p => p.AreaName));//实体嵌SS套实体集合映射CreateMap<City1, CityDto1>();CreateMap<Area, AreaDtos>();//映射时匹配前缀RecognizePrefixes("T_");//映射匹配后缀RecognizePostfixes("_tb1");CreateMap<People, ChildDto>();}}
}

2.4注入automapper服务

  builder.Services.AddAutoMapper(typeof(CustomProfile));

2.5编写控制器类

using AutoMapper;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.WebUtilities;
using Microsoft.Net.Http.Headers;
using webapi.Data;namespace webapi.Controllers;/// <summary>
/// automappe测试
/// </summary>
[ApiController]
[Route("[controller]/[action]")]
public class MapperTestController : ControllerBase
{public readonly IMapper _mapper;/// <summary>/// 注入服务/// </summary>public MapperTestController(IMapper mapper){_mapper = mapper;}/// <summary>/// 实体转DTO/// </summary>///<remarks></remarks>/// <returns></returns>[HttpGet]public ActionResult<StuDto> EntityToDto(){Stu stu = new Stu(){Id = 1,Name = "Test",Address = "江苏",NickName = "pp00",Sex = true};//StuDto stuDto = _mapper.Map<StuDto>(stu);// _mapper.Map<StuDto>(stu)和 _mapper.Map(stu, new StuDto())效果一样StuDto stuDto = _mapper.Map(stu, new StuDto());return stuDto;}/// <summary>/// DTO转实体/// </summary>/// <returns></returns>[HttpGet]public ActionResult<Stu> DtoToEntity(){StuDto stuDto = new StuDto(){Id = 1,Name = "Test",Address = "江苏",NickName = "pp00",Sex = true};Stu stu = _mapper.Map<Stu>(stuDto);return stu;}/// <summary>/// 实体转dto字段名不同/// </summary>/// <remarks>Stu1 No stuDto Id</remarks>/// <returns></returns>[HttpGet]public ActionResult<StuDto> FieldsNotSame(){Stu1 stu = new Stu1(){No = 1,Name = "Test",Address = "江苏",NickName = "pp00",Sex = true};StuDto stuDto = _mapper.Map(stu, new StuDto());return stuDto;}/// <summary>///实体转DTO,数据内容进行转换 Stu2 性别是 1和0 转成 StuDto1 中的男和女/// </summary>/// <returns></returns>[HttpGet]public ActionResult<StuDto1> ContentConverter(){Stu1 stu = new Stu1(){No = 1,Name = "Test",Address = "江苏",NickName = "pp00",Sex = true};StuDto1 stuDto1 = _mapper.Map<StuDto1>(stu);return stuDto1;}/// <summary>/// 忽略字段/// 被忽略的字段会采用默认值/// </summary>/// <returns></returns>[HttpGet]public ActionResult<Stu2> IgnoreFile(){StuDto2 stu = new StuDto2(){Id = 100,Name = "Test",Address = "江西",NickName = "Test",Sex = true};Stu2 stu2 = _mapper.Map<Stu2>(stu);return stu2;}/// <summary>/// list集合实体转list集合dto/// </summary>/// <returns></returns>[HttpGet]public ActionResult<List<StuDto>> AttachEntityToDto(){List<Stu> stuls = new List<Stu>() {new Stu(){Id = 1,Name = "Test",Address = "江苏",NickName = "pp00",Sex = true},new Stu() {Id = 2,Name = "Test",Address = "江苏",NickName = "pp00",Sex = true},new Stu() {Id = 3,Name = "Test",Address = "江苏",NickName = "pp00",Sex = true},};var result = _mapper.Map<List<StuDto>>(stuls);return result;}/// <summary>/// 嵌套映射单实体/// 如果嵌套的单实体字段和dto相同,就只需配置外层实体的映射/// </summary>/// <returns></returns>[HttpGet]public ActionResult<CityDto> NestedMapping(){City city = new City(){Id = 1,CityName = "南京",area = new Area(){AreaId = 1001,AreaName = "栖霞区"}};CityDto cityDto = _mapper.Map<CityDto>(city);return cityDto;}/// <summary>/// 嵌套映射list集合/// 需要配置外表的映射关系和嵌套list集合表的映射关系/// </summary>/// <returns></returns>[HttpGet]public ActionResult<CityDto1> NestedListMapping(){City1 city = new City1(){Id = 1,CityName = "南京",area = new List<Area>(){new Area() {AreaId=1001,AreaName="雨花台"},new Area() {AreaId=1002,AreaName="建业"},}};CityDto1 cityDto = _mapper.Map<CityDto1>(city);return cityDto;}/// <summary>/// 映射匹配前缀和后缀/// </summary>/// <returns></returns>[HttpGet]public ActionResult<ChildDto> Recognizeprefixes(){People p1 = new People(){T_Age = 10,T_Name = "Test",Address_tb1 = "江西",sex_tb1 = "男"};return _mapper.Map<ChildDto>(p1);}
}

上面的几种配置是,比较常用的,更多的配置自己可以去自己摸索。
end

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/580713.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mybatis-Plus基础之Mapper增删改

文章目录 一、普通增删改普通新增普通删除根据 entity 条件&#xff0c;删除记录根据 ID 批量删除根据 ID 删除根据 columnMap 条件&#xff0c;删除记录 普通修改根据 whereWrapper 条件&#xff0c;更新记录根据 ID 修改 二、insert ID 主键回填三、条件删除&#xff1a;使用…

【C语言学习疑难杂症】第12期:如何从汇编角度深入理解y = (*--p)++这行代码(易懂版)

对于如下代码,思考一下输出结果是什么? int a[] = {5, 8, 7, 6, 2, 7, 3}; int y, *p = &a[1]; y = (*--p)++; printf("%d ",y); printf("%d",a[0]); 这个代码看似简单,但是在“y = (*--p)++;”这行代码里,编译器做了很多工作。 我们在vs2022的…

系列十七(面试)、请你谈谈RocketMQ的消息丢失问题

一、RocketMQ的消息丢失问题 1.1、概述 生产环境中为了保证服务的高可用&#xff0c;一般情况下都是采用集群的方式&#xff0c;RocketMQ也不例外&#xff0c;另外现在企业级的开发基本都是分布式微服务的模式&#xff0c;这就存在着跨网络传输数据的问题&#xff0c;而网络传…

促进软件开发团队创新的方法和团队协作原则

在迅速发展的科技领域&#xff0c;创新成为软件开发团队不可或缺的一部分。为了在竞争激烈的市场中保持竞争力&#xff0c;团队需要采用创新的方法&#xff0c;并建立一种积极的团队协作文化。本文将探讨一些促进软件开发团队创新的方法和团队协作原则。 1. 鼓励创意和实验 为团…

qt中实现鼠标拖动一张图片到qt控件内,图片自动在控件中展示

很多电脑软件都有鼠标拖动一张图片或者拖动一个文件到软件的指定区域内&#xff0c;就可以自动在软件中显示图片内容或者文件内容。qt中也可以这样实现。 本文介绍两种方法&#xff1a; 1、只可以以非管理员的身份运行软件时&#xff0c;才可以实现上述功能。 mainwindow.h#…

orangepi--开发板配置网络SSH登录

常用指令&#xff1a; ifconfig-------------------------------------查看网络地址 sudo passwd orangepi-------------------------改密码 nmcli dev wifi-------------------------------查看wifi nmcli dev wifi connect xx password xx--------连接网络 ip addr show wla…

【PTA】L1-016 验证身份(C++)

题目链接 &#xff1a; 题目要求&#xff1a; 一个合法的身份证号码由17位地区、日期编号和顺序编号加1位校验码组成。校验码的计算规则如下&#xff1a; 首先对前17位数字加权求和&#xff0c;权重分配为&#xff1a;{7&#xff0c;9&#xff0c;10&#xff0c;5&#xff0…

【七】【C语言\动态规划】最大子数组和、环形子数组的最大和、乘积最大子数组,三道题目深度解析

动态规划 动态规划就像是解决问题的一种策略&#xff0c;它可以帮助我们更高效地找到问题的解决方案。这个策略的核心思想就是将问题分解为一系列的小问题&#xff0c;并将每个小问题的解保存起来。这样&#xff0c;当我们需要解决原始问题的时候&#xff0c;我们就可以直接利…

成交订单的条件是什么?搞清楚后再去开发客户

订单&#xff0c;也就是贵司某个产品满足了客户的需求&#xff0c;双方达成合作意向&#xff0c;说白也就是商品需求和供给的匹配。 那么&#xff0c;想要客户下订单&#xff0c;就要弄明白什么样的产品才能满足客户的需求匹配&#xff1f;了解客户关心的点在哪些方面&#xf…

python脚本抢各大平台大额优惠卷

文章目录 python脚本抢各大平台大额优惠卷写在前面准备阶段一、所需工具二、ChromeDriver下载教程 三、Seleuinm安装1、打开cmd&#xff0c;输入如下命令 开始抢券淘宝脚本京东抢购脚本 python脚本抢各大平台大额优惠卷 写在前面 当电商平台上演盛大的购物狂欢时&#xff0c;如…

SpringBoot3 基础特性

1. SpringApplication 1.1. 自定义 banner 类路径添加banner.txt或设置spring.banner.location就可以定制 banner推荐网站&#xff1a;Spring Boot banner 在线生成工具&#xff0c;制作下载英文 banner.txt&#xff0c;修改替换 banner.txt 文字实现自定义&#xff0c;个性化…

数据驱动与数据安全,自动驾驶看得见的门槛和看不见的天花板

作者 |田水 编辑 |德新 尽管心理有所准备&#xff0c;2023年智能驾驶赛道的内卷程度还是超出了大多数人的预期。 这一年&#xff0c;汽车价格战突然开打&#xff0c;主机厂将来自销售终端的价格压力&#xff0c;传导到下游智驾供应商&#xff0c;于是&#xff0c;市面上出现…

医院云HIS系统源码,saas多医院版,适用于专科医院、集团医院、基层医院

医院云HIS系统源码&#xff0c;自主研发&#xff0c;自主版权&#xff0c;电子病历病历4级 系统概述&#xff1a; 一款满足基层医院各类业务需要的云HIS系统。该系统能帮助基层医院完成日常各类业务&#xff0c;提供病患挂号支持、病患问诊、电子病历、开药发药、会员管理、统…

数据结构:单调栈

1.单调栈 单调栈是一种数据结构&#xff0c;其中存放的数据应该是有序的&#xff0c;所以单调栈也有单调递减栈和单调递增栈 单调递增栈&#xff1a;栈顶到栈底的元素大小是从小到大 单调递减栈&#xff1a;栈顶到栈底的元素大小是从大到小 单调栈主要就是用来求一个给定序列中…

【unity3D-粒子系统】粒子系统主模块-Particle System篇

&#x1f497; 未来的游戏开发程序媛&#xff0c;现在的努力学习菜鸡 &#x1f4a6;本专栏是我关于游戏开发的学习笔记 &#x1f236;本篇是unity的粒子系统主模块-Particle System 基础知识 Particle System 介绍&#xff1a;粒子系统的主模块&#xff0c;是必需的模块&#x…

ESP8266 ESP-01/01s 工作模式与固件下载烧录接线

注意点&#xff1a; ESP8266 ESP-01与 ESP8266 ESP-01s接线类似 。本文使用的是ESP8266 ESP-01 WIFI模块&#xff0c;详细信息见如下图片。本文固件下载的是ESP8266 的MQTT固件&#xff0c;下载其它固件流程一致。本文使用的是杜邦线连接面包板来进行使用&#xff0c;与使用开发…

《人生何处不相逢》歌词解析

很少仔细思考某首歌的歌词&#xff0c;上次解析还是费玉清的《一剪梅》&#xff0c;不过那个在我的小红书上&#xff0c;这首歌曲子罗大佑的作品&#xff0c;简宁填词&#xff0c;陈慧娴演唱&#xff0c;表达了对缘分的无常和缘尽的伤感&#xff0c;以及缘分的可贵 1.随浪随风…

DRF从入门到精通五(路由组件、认证组件、权限组件、频率组件及认证、权限源码分析)

文章目录 一、路由组件REST framework提供了两个routeraction装饰器 二、认证组件(Authentication)三、权限组件(Permissions)内置权限类 四、频率组件(Throttling)五、权限组件源码分析六、认证组件源码分析 一、路由组件 对于视图集ViewSetMixin&#xff0c;我们除了可以自己…

YOLOv8可视化:引入多种可视化CAM方法,为科研保驾护航

💡💡💡本文内容:调用pytorch下的CAM可视化库,支持十多种可视化方法,打开“黑盒”,让YOLOv8变得相对可解释性 收录 YOLOv8原创自研 https://blog.csdn.net/m0_63774211/category_12511737.html?spm=1001.2014.3001.5482 💡💡💡全网独家首发创新(原创),适…

代理IP使用的IP协议有哪些?优质的动态IP有什么特征?

一、代理IP使用的IP协议 代理IP使用的主要IP协议有三种&#xff1a;HTTP协议、SOCKS协议和FTP协议。 1. HTTP协议&#xff1a;是最常用的协议&#xff0c;通过HTTP协议传输的数据是明文&#xff0c;它可以在任意多的机器上使用&#xff0c;并且工作方式是可靠的。它是一个无状态…