AutoMapper入门

在 ASP.NET Core 开发中,我们经常需要在不同层之间传递数据:比如从数据库模型(Entity)转换到 DTO,再从 DTO 转换为前端视图模型。这些转换代码大量重复、冗长、容易出错。为了解决这个问题,AutoMapper 诞生了。

本文主要介绍在WebApi(.net 8)环境中使用AutoMapper 14.0.0

官方文档地址:AutoMapper — AutoMapper documentation

一、什么是 AutoMapper?

AutoMapper 是一个 .NET 类库,它能自动在两个类型之间做映射,尤其是当这些类型拥有相似属性时。它减少了手动编写 obj.Prop = dto.Prop 的重复性劳动。

public class Student
{public string Name { get; set; }public int Age { get; set; }public string Address{ get; set; }public string Nickname{ get; set; }
}public class Dto_Student
{public string Name { get; set; }public int Age { get; set; }
}

可以直接通过 AutoMapper 在这两者之间做转换,而无需显式赋值。

二、基本用法:从零开始配置

1.安装 NuGet 包

dotnet add package AutoMapper --version 14.0.0

13.0开始无需引入AutoMapper.Extensions.Microsoft.DependencyInjection 

2.配置映射关系

创建一个映射配置 Profile 类:

public class StudentProfile : Profile
{public StudentProfile(){CreateMap<Student, Dto_Student>();CreateMap<Dto_Student, Student>();}
}

3.在 Program.cs中注册

using AutoMapper;namespace AutoMapperProfileConfig
{/// <summary>/// 标记程序集哑类/// </summary>public class AutoMapperProfileConfigMarker : Profile{public AutoMapperProfileConfigMarker(){}}
}
builder.Services.AddAutoMapper(typeof(AutoMapperProfileConfigMarker).Assembly);

 

建议专门建立一个类库,同时为每个表的映射创建一个映射类,然后创建一个专门标记程序集而不做其他事的一个哑类.

这样可以自动扫描该类库里面的所有的Profile类(还有几种其他方法,可自行查看)

4.依赖注入使用映射服务

[ApiController]
[Route("api/[controller]")]
public class StudentController : ControllerBase
{private readonly YourDbContext _context;private readonly IMapper _mapper;public StudentController(YourDbContext context, IMapper mapper){_context = context;_mapper = mapper;}// GET: api/Student[HttpGet]public async Task<ActionResult<IEnumerable<Dto_Student>>> GetStudents(){// 从数据库获取 Student 实体列表var students = await _context.Students.ToListAsync();// 使用 AutoMapper 将实体列表映射为 DTO 列表var studentDtos = _mapper.Map<List<Dto_Student>>(students);// 返回给前端return Ok(studentDtos);}
}

5.命名约定 

默认情况映射的属性名必须完全一致,但你可以配置实现特殊的映射关系.

AutoMapper 中命名约定的优先级关系如下:

     优先级从高到低:

  1. CreateMap().ForMember() 明确指定字段映射

  2. Profile 中设置的命名约定

  3. 全局设置(MapperConfiguration 中配置)

  4. 默认行为(ExactMatchNamingConvention)

public class Source
{public string user_id { get; set; }
}public class Destination
{public string UserId { get; set; }
}

 

情况 1:使用 .ForMember() 明确映射

CreateMap<Source, Destination>().ForMember(dest => dest.UserId, opt => opt.MapFrom(src => src.user_id));

优先级最高,无论有没有配置命名约定,它都生效

情况 2:Profile 中设置命名约定

public class MyProfile : Profile
{public MyProfile(){SourceMemberNamingConvention = LowerUnderscoreNamingConvention.Instance;DestinationMemberNamingConvention = PascalCaseNamingConvention.Instance;CreateMap<Source, Destination>();}
}

会生效,但仅限于此 Profile 中的 CreateMap 映射。 

情况 3:全局配置命名约定

services.AddAutoMapper(cfg =>
{cfg.SourceMemberNamingConvention = LowerUnderscoreNamingConvention.Instance;cfg.DestinationMemberNamingConvention = PascalCaseNamingConvention.Instance;
}, typeof(SomeMarker));

会自动应用到所有未手动指定命名规则的 Profile 中的映射

情况 4:都不配置时,默认使用 ExactMatch

即只匹配名字完全一致(区分大小写)的属性名

设置方式作用范围优先级备注
.ForMember()某个字段映射🥇 最高覆盖一切
Profile 中命名约定当前 Profile🥈 中高优于全局配置
cfg.SourceMemberNamingConvention所有 Profile🥉 中等默认使用
不设置使用 ExactMatch最低仅匹配完全相同

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

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

相关文章

PyTorch武侠演义 第一卷:初入江湖 第1章:武林新秀遇Tensor - 张量基础

第一卷&#xff1a;初入江湖 第1章&#xff1a;武林新秀遇Tensor - 张量基础晨起码农村 鸡鸣三声&#xff0c;林小码已经收拾好了行囊。他最后看了眼床头那本翻旧的《Python入门心法》&#xff0c;轻轻抚平卷起的书角。 "小码&#xff0c;路上小心。"父亲将一把青铜匕…

Python进阶(4):类与面向对象程序设计

面向对象OOPOOP:Object Oriented Programming,面向对象编程,面向对象中的对象(Obiect)&#xff0c;通常是指客观世界中存在的对象&#xff0c;这个对象具有唯一性&#xff0c;对象之间各不相同&#xff0c;各有各的特点&#xff0c;每个对象都有自己的运动规律和内部状态;对象与…

如何在 Shopify 中创建退货标签

退货是电商运营中不可避免的一环&#xff0c;而一个顺畅、透明的退货流程&#xff0c;不仅能减少客户投诉&#xff0c;也有助于提升顾客对品牌的信任与忠诚度。Shopify 虽然没有内建退货标签自动生成功能&#xff0c;但通过合理设置与外部工具整合&#xff0c;你完全可以打造一…

I2C设备寄存器读取调试方法

1、查看I2C挂载设备 2、读取i2C设备所有寄存器 3、读取i2c设备的某个寄存器 4、向i2C设备某个寄存器写入一个值1、查看

K8S的Helm包管理器

一、背景 官网: https://helm.sh/ 我们针对K8S环境中&#xff0c;部署对应的应用&#xff0c;无外乎就是编写一堆yaml资源清单文件. 资源清单、依赖性少的时候&#xff0c;可以直接手动维护。但是&#xff0c;随着资源清单越来越复杂&#xff0c;越来越多&#xff0c;不同的环…

多模态数据处理新趋势:阿里云ODPS技术栈深度解析与未来展望

多模态数据处理新趋势&#xff1a;阿里云ODPS技术栈深度解析与未来展望 &#x1f31f; 嗨&#xff0c;我是IRpickstars&#xff01; &#x1f30c; 总有一行代码&#xff0c;能点亮万千星辰。 &#x1f50d; 在技术的宇宙中&#xff0c;我愿做永不停歇的探索者。 ✨ 用代码丈…

AI数据分析仪设计原理图:RapidIO信号接入 平板AI数据分析仪

AI数据分析仪设计原理图&#xff1a;RapidIO信号接入 平板AI数据分析仪 1 、概述 本仪器是一款面向工业控制、新能源、震动测量等业务开发的平板AI数据分析仪。基于 Jetson Orin Nano&#xff08;AI边缘计算&#xff09;、实现RapidIO接口数据接入&#xff0c;进行AI分析。Rap…

人工智能正逐步商品化,而“理解力”才是开发者的真正超能力

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

玩转ClaudeCode:ClaudeCode安装教程(Windows+Linux+MacOS)

Windows 环境安装 Claude Code 一、安装 WSL 环境 1. 确认 Windows 功能已开启 打开 “控制面板 → 程序 → 启用或关闭 Windows 功能” 勾选 “适用于 Linux 的 Windows 子系统” 和 “虚拟机平台” 点“确定”后重启电脑。 开机后&#xff0c;管理员模式打开 Terminal…

PyTorch多层感知机(MLP)模型构建与MNIST分类训练

冲冲冲&#x1f60a; here&#x1f60a; 文章目录PyTorch多层感知机模型构建与MNIST分类训练笔记&#x1f3af; 1. 任务概述⚙️ 2. 环境设置2.1 导入必要库2.2 GPU配置&#x1f9e0; 3. 模型构建3.1 模型定义关键点3.2 损失函数选择3.3 模型初始化与设备选择&#x1f527; 4. …

android tabLayout 切换fragment fragment生命周期

1、TabLayout 与 Fragment 结合使用的常见方式 通常会使用 FragmentPagerAdapter 或 FragmentStatePagerAdapter 与 ViewPager 配合,再将 TabLayout 与 ViewPager 关联,实现通过 TabLayout 切换 Fragment。 以下是布局文件示例 activity_main.xml: <LinearLayout xmln…

马蹄集 BD202401补给

可怕的战争发生了&#xff0c;小度作为后勤保障工作人员&#xff0c;也要为了保卫国家而努力。现在有 N(1≤N≤)个堡垒需要补给&#xff0c;然而总的预算 B(1≤B≤)是有限的。现在已知第 i 个堡垒需要价值 P(i) 的补给&#xff0c;并且需要 S(i) 的运费。 鉴于小度与供应商之间…

《Llava:Visual Instruction Tuning》论文精读笔记

论文链接&#xff1a;arxiv.org/pdf/2304.08485 参考视频&#xff1a;LLAVA讲解_哔哩哔哩_bilibili [论文速览]LLaVA: Visual Instruction Tuning[2304.08485]_哔哩哔哩_bilibili 标题&#xff1a;Visual Instruction Tuning 视觉指令微调 背景引言 大模型的Instruction…

【DataWhale】快乐学习大模型 | 202507,Task01笔记

引言 我从2016年开始接触matlab看别人做语音识别&#xff0c;再接触tensorflow的神经网络&#xff0c;2017年接触语音合成&#xff0c;2020年做落地的医院手写数字识别。到2020年接触pytorch做了计算机视觉图像分类&#xff0c;到2021年做了目标检测&#xff0c;2022年做了文本…

机器学习中的朴素贝叶斯(Naive Bayes)模型

1. 用实例来理解朴素贝叶斯 下面用具体的数据来演示垃圾邮件 vs 正常邮件的概率计算假设我们有一个小型邮件数据集邮件内容类别&#xff08;垃圾/正常&#xff09;“免费 赢取 大奖”垃圾“免费 参加会议”正常“中奖 点击 链接”垃圾“明天 开会”正常“赢取 免费 礼品”垃圾 …

document.documentElement详解

核心概念定义 它始终指向当前文档的根元素&#xff0c;在 HTML 文档中对应 <html> 标签。与 document.body&#xff08;对应 <body>&#xff09;和 document.head&#xff08;对应 <head>&#xff09;形成层级关系。与 document.body 的区别 <html> &l…

c#进阶之数据结构(动态数组篇)----Queue

1、简介这个是c#封装的队列类型&#xff0c;同栈相反&#xff0c;这个是先进先出&#xff0c;一般用于事件注册&#xff0c;或者数据的按顺序处理&#xff0c;理解为需要排队处理的可以用队列来处理。注意&#xff0c;队列一定是有顺序的&#xff0c;先进确实是会先出&#xff…

使用 keytool 在服务器上导入证书操作指南(SSL 证书验证错误处理)

使用 keytool 在服务器上导入证书操作指南(SSL 证书验证错误处理) 一、概述 本文档用于指导如何在运行 Java 应用程序的服务器上,通过keytool工具将证书导入 Java 信任库,解决因证书未被信任导致的 SSL/TLS 通信问题(如PKIX path building failed错误)。 二、操作步骤…

VUE export import

目录 命名导出 导出变量 导出函数 总结 默认导出 导出变量 导出函数 总结 因为总是搞不懂export和Import什么时候需要加{}&#xff0c;什么时候不用&#xff0c;所以自己测试了一下&#xff0c;以下是总结。 需不需要加{}取决于命名导出还是默认导出&#xff0c;命名导…

端侧宠物识别+拍摄控制智能化:解决设备识别频次识别率双低问题

随着宠物成为家庭重要成员&#xff0c;宠物影像创作需求激增&#xff0c;传统相机系统 “人脸优先” 的调度逻辑已难以应对宠物拍摄的复杂场景。毛发边缘模糊、动态姿态多变、光照反差剧烈等问题&#xff0c;推动着智能拍摄技术向 “宠物优先” 范式转型。本文基于端侧 AI 部署…