ASP.NET Core Web中使用AutoMapper进行对象映射

news/2024/11/20 3:25:34/文章来源:https://www.cnblogs.com/Can-daydayup/p/18197033

前言

在日常开发中,我们常常需要将一个对象映射到另一个对象,这个过程中可能需要编写大量的重复性代码,如果每次都手动编写,不仅会影响开发效率,而且当项目越来越复杂、庞大的时候还容易出现错误。为了解决这个问题,对象映射库就随之而出了,这些库可以自动完成对象之间的映射,从而减少大量的开发工作量,提高开发工作效率。今天我们来讲讲在ASP.NET Core Web中使用AutoMapper快速进行对象映射。

使用对象映射库有哪些好处?

  • 减少开发工作量,提高开发效率。
  • 减少开发过程中的错误和bug。
  • 简化代码结构,提高代码可读性和可维护性。

AutoMapper对象映射库介绍

AutoMapper是一个简单易用的.NET对象映射库,用于快速、方便地进行对象之间的转换和映射,极大的简化了开发人员在处理对象映射时的工作量。

  • GitHub开源地址:https://github.com/AutoMapper/AutoMapper
  • 在线文档地址:https://docs.automapper.org/en/stable/Getting-started.html

安装AutoMapper NuGet包

在ASP.NET Core Web API项目中搜索:AutoMapper NuGet包安装。

创建源对象和目标对象

接下来我们分别定义一个源对象(Student)和一个目标对象(StudentViewModel)。

Student(源对象)

    public class Student
    {
        /// <summary>
        /// 学生ID [主键,自动递增]
        /// </summary>
        [PrimaryKey, AutoIncrement]
        [Display(Name = "学生ID")]
        public int StudentID { get; set; }

        /// <summary>
        /// 班级ID
        /// </summary>
        [Display(Name = "班级ID")]
        public int ClassID { get; set; }

        /// <summary>
        /// 学生姓名
        /// </summary>
        [Display(Name = "学生姓名")]
        public string Name { get; set; }

        /// <summary>
        /// 学生年龄
        /// </summary>
        [Display(Name = "学生年龄")]
        public int Age { get; set; }

        /// <summary>
        /// 学生性别
        /// </summary>
        [Display(Name = "学生性别")]
        public string Gender { get; set; }
    }

StudentViewModel(目标对象)

    public class StudentViewModel
    {
        /// <summary>
        /// 学生ID [主键,自动递增]
        /// </summary>
        [PrimaryKey, AutoIncrement]
        [Display(Name = "学生ID")]
        public int StudentID { get; set; }

        /// <summary>
        /// 班级ID
        /// </summary>
        [Display(Name = "班级ID")]
        public int ClassID { get; set; }

        /// <summary>
        /// 学生姓名
        /// </summary>
        [Display(Name = "学生姓名")]
        public string Name { get; set; }

        /// <summary>
        /// 学生年龄
        /// </summary>
        [Display(Name = "学生年龄")]
        public int Age { get; set; }

        /// <summary>
        /// 学生性别
        /// </summary>
        [Display(Name = "学生性别")]
        public string Gender { get; set; }

        /// <summary>
        /// 班级名称
        /// </summary>
        [Display(Name = "班级名称")]
        public string ClassName { get; set; }
    }

配置AutoMapper映射规则

我们可以定义一个AutoMapperMappingProfile的映射配置文件,并在其中定义源类型和目标类型之间的映射关系。

using AutoMapper;
using Entity;
using Entity.ViewModel;

namespace WebApi
{
    /// <summary>
    /// AutoMapper映射配置文件
    /// </summary>
    public class AutoMapperMappingProfile : Profile
    {
        /// <summary>
        /// 添加映射规则
        /// </summary>
        public AutoMapperMappingProfile()
        {
            CreateMap<Student, StudentViewModel>();
        }
    }
}

Program中注册AutoMapper服务

使用AddAutoMapper()方法可以将AutoMapper所需的服务添加到该集合中,以便在应用程序的其他部分中使用。该方法需要传入一个Assembly数组,以告诉AutoMapper要扫描哪些程序集来查找映射配置(在当前作用域的所有程序集里面扫描AutoMapper的配置文件)。

        public static void Main(string[] args)
        {
            var builder = WebApplication.CreateBuilder(args);

            builder.Services.AddControllers();

            //添加 AutoMapper 的配置
            //使用AddAutoMapper()方法可以将AutoMapper所需的服务添加到该集合中,以便在应用程序的其他部分中使用。
            //该方法需要传入一个Assembly数组,以告诉AutoMapper要扫描哪些程序集来查找映射配置(在当前作用域的所有程序集里面扫描AutoMapper的配置文件)。
            builder.Services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies());

        }

进行对象映射操作

依赖注入获取IMapper接口的实例

    /// <summary>
    /// 学生管理
    /// </summary>
    [ApiController]
    [Route("api/[controller]/[action]")]
    public class StudentController : ControllerBase
    {
        private readonly IMapper _mapper;

        /// <summary>
        /// 依赖注入
        /// </summary>
        /// <param name="mapper">mapper</param>
        public StudentController(IMapper mapper)
        {
            _mapper = mapper;
        }
    }

进行对象映射操作

接下来我们使用使用IMapper接口的Map方法来进行对象映射操作。

var studentsListDto = _mapper.Map<List<StudentViewModel>>(students);

映射结果输出

完整示例源代码

  • https://github.com/YSGStudyHards/EasySQLite

DotNetGuide技术社区交流群

  • DotNetGuide技术社区是一个面向.NET开发者的开源技术社区,旨在为开发者们提供全面的C#/.NET/.NET Core相关学习资料、技术分享和咨询、项目框架推荐、求职和招聘资讯、以及解决问题的平台。
  • 在DotNetGuide技术社区中,开发者们可以分享自己的技术文章、项目经验、学习心得、遇到的疑难技术问题以及解决方案,并且还有机会结识志同道合的开发者。
  • 我们致力于构建一个积极向上、和谐友善的.NET技术交流平台。无论您是初学者还是有丰富经验的开发者,我们都希望能为您提供更多的价值和成长机会。

欢迎加入DotNetGuide技术社区微信交流群👨‍👩‍👦

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

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

相关文章

Socket层

【一】什么是socketSocket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面 对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。所以,我们无需深…

金融系统数据同步方案哪家最强,了解一下!

金融系统数据同步是金融行业信息化和数据化发展的关键组成部分,它对于保障数据安全、提升系统性能和满足日益增长的数据时效性要求至关重要。以下是一些金融系统中数据同步的关键应用场景和需求:1、多数据中心操作:金融机构通常在多个数据中心运行,需要确保数据在这些中心之…

Dapr 与 .NET Aspire 结合使用获得无与伦比的本地开发体验

Dapr 提供了一组构建块,用于抽象分布式系统中常用的概念。这包括服务、缓存、工作流、复原能力、机密管理等之间的安全同步和异步通信。不必自己实现这些功能,可以消除样板,降低复杂性,并允许您专注于开发业务功能。在您的时间有限并且您只想进行实验的情况下,在Dapr初始设…

网络架构和网络通信

【一】常见的网络架构模式 【1】CS模型C是英文单词“Client”的首字母,即客户端的意思 C/S就是“Client/Server”的缩写,即“客户端/服务器”模式。例如:拼多多APP、PC上的有道云笔记等等【2】BS模型B是英文单词“Browser”的首字母,即浏览器的意思; S是英文单词“Server”…

记录仪测评 记录仪测评设置4k结果1080

设置4K 实际效果1080不到记录仪测评设置4k结果1080 https://baijiahao.baidu.com/builder/preview/s?id=1799258600924107729 LOK00018.AVI音频编码信息ID : 1格式 : PCM格式参数设置, Endianness : Little格式参数设置, Sign : Signed编解码器ID : 1编解码器ID/Hint : Micros…

mpdf增加字体并进行使用

1、先将字体复制到目录:\vendor\mpdf\mpdf\ttfonts2、再修改文件\vendor\mpdf\mpdf\src\Config\FontVariables.php,对照已经添加的simsun,simkai,simhei,fangzhenweibei,fangzhenheiti等字体进行增加即可。3、再在需要设置字体的文字加上font-family:fangzhenweibei;样式…

初识上位机(下):C#读写PLC数据块数据

作为一个工业自动化领域的程序员,不懂点PLC和上位机,貌似有点说不过去。这里我用两篇小文带你快速进入上位机开发领域。上一篇,我们搭建了一个PLC的模拟仿真环境,本篇我们使用C#开发一个简单的PLC数据读取和写入的应用程序。大家好,我是Edison。 作为一个工业自动化领域的…

Markdown Editor 好用的工具

必要要记录一下,下次好找到。 Office Viewer(Markdown Editor) 好用的工具。 很适合我的。

linux开发和部署lazarus中间件

linux开发和部署lazarus中间件linux开发和部署lazarus中间件 1)linux开发的编译中间件2)linux部署中间件 本文来自博客园,作者:{咏南中间件},转载请注明原文链接:https://www.cnblogs.com/hnxxcxg/p/18197098

dotnet 设置 X11 建立窗口之间的父子关系

在 X11 里面有和 Win32 类似的窗口之间的关系机制,如 Owner-Owned 关系,以及 Parent-Child 关系。本文将告诉大家如何进行设置以及其行为本文将大量使用到 new bing 提供的回答内容,感谢 new bing 人工智能提供的内容 Owner-Owned 关系在这种关系中,一个窗口可以被另一个窗…

学习 Avalonia 框架笔记 设置 X11 窗口从最小化状态还原为正常状态

本文记录在 dotnet 里面如何设置 X11 窗口从最小化状态还原为正常状态本文属于学习 Avalonia 框架系列笔记,更多请参阅 博客导航 核心设置方法如下 /// <summary> /// 代码从 Avalonia 抄的 https://github.com/AvaloniaUI/Avalonia/blob/5e323b8fb1e2ca36550ca6fe678e4…

[转帖]全网最硬核 JVM 内存解析 - 4.Java 堆内存大小的确认

https://cloud.tencent.com/developer/article/2277323 个人创作公约:本人声明创作的所有文章皆为自己原创,如果有参考任何文章的地方,会标注出来,如果有疏漏,欢迎大家批判。如果大家发现网上有抄袭本文章的,欢迎举报,并且积极向这个 github 仓库 提交 issue,谢谢支持~…