我的编程空间,编程开发者的网络收藏夹
学习永远不晚

ASP.NET Core如何使用AutoMapper实现实体映射

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

ASP.NET Core如何使用AutoMapper实现实体映射

这篇文章将为大家详细讲解有关ASP.NET Core如何使用AutoMapper实现实体映射,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

一、前言

在实际的项目开发过程中,我们使用各种ORM框架可以使我们快捷的获取到数据,并且可以将获取到的数据绑定到对应的List<T>中,然后页面或者接口直接显示List<T>中的数据。但是我们最终想要显示在视图或者接口中的数据和数据库实体之间可能存在着差异,一般的做法就是去创建一些对应的“模型”类,然后对获取到的数据再次进行处理,从而满足需求。

因此,如果便捷的实现数据库持久化对象与模型对象之间的实体映射,避免在去代码中手工实现这一过程,就可以大大降低开发的工作量。AutoMapper就是可以帮助我们实现实体转换过程的工具。

二、使用AutoMapper实现实体映射

AutoMapper是一个OOM(Object-Object-Mapping)组件,从它的英文名字中可以看出,AutoMapper主要是为了实现实体间的相互转换,从而避免我们每次采用手工的方式进行转换。在没有OOM这类组件之前,如果我们需要实现实体之间的转换,只能使用手工修改代码,然后逐个赋值的方式实现映射,而有了OOM组件,可以很方便的帮助我们实现这一需求。看下面的一个例子。

首先创建一个ASP.NET Core WebApi项目:

ASP.NET Core如何使用AutoMapper实现实体映射

添加一个Student实体类:

namespace AutoMapperDemo.Model{    public class Student    {        public int ID { get; set; }        public string Name { get; set; }        public int Age { get; set; }        public string Gender { get; set; }    }}

添加StudentDTO类,跟Student属性一致。

然后添加一个类,模拟一些测试数据:

using AutoMapperDemo.Model;using System.Collections.Generic;namespace AutoMapperDemo{    public class Data    {        public static List<Student> ListStudent { get; set; }        public static List<Student> GetList()        {            ListStudent = new List<Student>();            for (int i = 0; i < 3; i++)            {                Student student = new Student()                 {                  ID=i,                  Name=$"测试_{i}",                  Age=20,                  Gender="男"                };                ListStudent.Add(student);            }            return ListStudent;        }    }}

添加Student控制器,通过Get方法获取所有的值:

using System.Collections.Generic;using System.Threading.Tasks;using AutoMapperDemo.Model;using Microsoft.AspNetCore.Mvc;namespace AutoMapperDemo.Controllers{    [Route("api/[controller]")]    [ApiController]    public class StudentController : ControllerBase    {        [HttpGet]        public async Task<List<Student>> Get()        {            List<Student> list = new List<Student>();            list = await Task.Run<List<Student>>(() =>             {                return Data.GetList();            });            return list;        }    }}

使用Postman进行测试:

ASP.NET Core如何使用AutoMapper实现实体映射

这样返回的数据直接就是数据库对应的实体类类型。这时需求改变了,我们要返回StudentDTO类型的数据,这时就需要修改代码:

using System.Collections.Generic;using System.Threading.Tasks;using AutoMapperDemo.DTO;using AutoMapperDemo.Model;using Microsoft.AspNetCore.Mvc;namespace AutoMapperDemo.Controllers{    [Route("api/[controller]")]    [ApiController]    public class StudentController : ControllerBase    {        [HttpGet]        public async Task<List<Student>> Get()        {            List<Student> list = new List<Student>();            list = await Task.Run<List<Student>>(() =>             {                return Data.GetList();            });            return list;        }        [HttpGet("GetDTO")]        public async Task<List<StudentDTO>> GetDto()        {            List<StudentDTO> list = new List<StudentDTO>();            List<Student>  listStudent = await Task.Run<List<Student>>(() =>            {                return Data.GetList();            });            // 循环给属性赋值            foreach (var item in listStudent)            {                StudentDTO dto = new StudentDTO();                dto.ID = item.ID;                dto.Name = item.Name;                dto.Age = item.Age;                dto.Gender = item.Gender;                // 加入到集合中                list.Add(dto);            }            return list;        }    }}

还是使用Postman进行测试:

ASP.NET Core如何使用AutoMapper实现实体映射

可以看到:这时返回的是DTO类型的数据。这种情况就是我们上面说的,需要手动修改代码,然后循环给对应的属性进行赋值。这里Student类只有4个属性,如果属性非常多,或者很多地方使用到了,如果还是采用这种方式进行赋值,那么就会很麻烦。假如以后其中的一个属性名称改变了,那么所有的地方也都需要修改,工作量就会很大。这时就需要使用AutoMapper解决。

首先引入AutoMapper包,直接在NuGet中引入:

ASP.NET Core如何使用AutoMapper实现实体映射

这里选择安装AutoMapper.Extensions.Microsoft.DependencyInjection这个包。这个包主要是为了让我们可以通过依赖注入的方式去使用AutoMapper。

新建StudentProfile类,继承自AutoMapper的Profile类,在无参构造函数中,我们就可以通过 CreateMap 方法去创建两个实体间的映射关系。

using AutoMapper;using AutoMapperDemo.DTO;using AutoMapperDemo.Model;namespace AutoMapperDemo.AutoMapper{    /// <summary>    /// 继承自Profile类    /// </summary>    public class StudentProfile: Profile    {        /// <summary>        /// 构造函数中实现映射        /// </summary>        public StudentProfile()        {            // Mapping            // 第一次参数是源类型(这里是Model类型),第二个参数是目标类型(这里是DTO类型)            CreateMap<Student, StudentDTO>();        }    }}

这里的 Profile有什么用呢?services.AddAutoMapper他会自动找到所有继承了Profile的类然后进行配置。

然后修改Student控制器,通过构造函数使用AutoMapper的注入,并使用AutoMapper实现自动映射:

using System.Collections.Generic;using System.Threading.Tasks;using AutoMapper;using AutoMapperDemo.DTO;using AutoMapperDemo.Model;using Microsoft.AspNetCore.Mvc;namespace AutoMapperDemo.Controllers{    [Route("api/[controller]")]    [ApiController]    public class StudentController : ControllerBase    {        private readonly IMapper _mapper;        /// <summary>        /// 通过构造函数实现依赖注入        /// </summary>        /// <param name="mapper"></param>        public StudentController(IMapper mapper)        {            _mapper = mapper;        }        [HttpGet]        public async Task<List<Student>> Get()        {            List<Student> list = new List<Student>();            list = await Task.Run<List<Student>>(() =>             {                return Data.GetList();            });            return list;        }        [HttpGet("GetDTO")]        public async Task<List<StudentDTO>> GetDto()        {            List<StudentDTO> list = new List<StudentDTO>();            List<Student>  listStudent = await Task.Run<List<Student>>(() =>            {                return Data.GetList();            });            //// 循环给属性赋值            //foreach (var item in listStudent)            //{            //    StudentDTO dto = new StudentDTO();            //    dto.ID = item.ID;            //    dto.Name = item.Name;            //    dto.Age = item.Age;            //    dto.Gender = item.Gender;            //    // 加入到集合中            //    list.Add(dto);            //}            // 使用AutoMapper进行映射            list = _mapper.Map<List<StudentDTO>>(listStudent);            return list;        }    }}

修改Startup类的ConfigureServices方法,添加AutoMapper:

public void ConfigureServices(IServiceCollection services){    #region 使用AutoMapper    // 参数类型是Assembly类型的数组 表示AutoMapper将在这些程序集数组里面遍历寻找所有继承了Profile类的配置文件    // 在当前作用域的所有程序集里面扫描AutoMapper的配置文件    services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies());    #endregion    services.AddControllers();}

再次使用Postman进行测试:

ASP.NET Core如何使用AutoMapper实现实体映射

可以看到,这样也实现了我们的需求,而且还不需要进行手动映射。

上面的示例中,Student和StudentDTO类里面的属性名称都是一样的,如果属性名称不一样呢?我们把StudentDTO类里面的ID改为StudentID,然后修改映射代码:

using AutoMapper;using AutoMapperDemo.DTO;using AutoMapperDemo.Model;namespace AutoMapperDemo.AutoMapper{    /// <summary>    /// 继承自Profile类    /// </summary>    public class StudentProfile: Profile    {        /// <summary>        /// 构造函数中实现映射        /// </summary>        public StudentProfile()        {            // Mapping            // 第一次参数是源类型(这里是Model类型),第二个参数是目标类型(这里是DTO类型)            // CreateMap<Student, StudentDTO>();            // 使用自定义映射 Student类的ID映射到StudentDTO类的StudentID            CreateMap<Student, StudentDTO>()                .ForMember(destinationMember: des => des.StudentID, memberOptions: opt => { opt.MapFrom(mapExpression: map => map.ID); });        }    }}

再次使用Postman进行测试:

ASP.NET Core如何使用AutoMapper实现实体映射

这样就实现了自定义映射。这里是映射了一个字段,如果是多个字段不同呢? 修改StudentDTO类:

namespace AutoMapperDemo.DTO{    public class StudentDTO    {        public int StudentID { get; set; }        public string StudentName { get; set; }        public int StudentAge { get; set; }        public string StudentGender { get; set; }    }}

然后修改映射配置类:

using AutoMapper;using AutoMapperDemo.DTO;using AutoMapperDemo.Model;namespace AutoMapperDemo.AutoMapper{    /// <summary>    /// 继承自Profile类    /// </summary>    public class StudentProfile: Profile    {        /// <summary>        /// 构造函数中实现映射        /// </summary>        public StudentProfile()        {            // Mapping            // 第一次参数是源类型(这里是Model类型),第二个参数是目标类型(这里是DTO类型)            // CreateMap<Student, StudentDTO>();            // 使用自定义映射 Student类的ID映射到StudentDTO类的StudentID            //CreateMap<Student, StudentDTO>()            //    .ForMember(destinationMember: des => des.StudentID, memberOptions: opt => { opt.MapFrom(mapExpression: map => map.ID); });            // 对多个属性进行自定义映射            CreateMap<Student, StudentDTO>()                .ForMember(destinationMember: des => des.StudentID, memberOptions: opt => { opt.MapFrom(mapExpression: map => map.ID); })                .ForMember(destinationMember: des => des.StudentName, memberOptions: opt => { opt.MapFrom(mapExpression: map => map.Name); })                .ForMember(destinationMember: des => des.StudentAge, memberOptions: opt => { opt.MapFrom(mapExpression: map => map.Age); })                .ForMember(destinationMember: des => des.StudentGender, memberOptions: opt => { opt.MapFrom(mapExpression: map => map.Gender); });        }    }}

在使用Postman进行测试:

ASP.NET Core如何使用AutoMapper实现实体映射

这样就实现了多个属性的自定义映射。 

上面的实例中是从Student映射到StudentDTO,那么可以从StudentDTO映射到Student吗?答案是肯定的,只需要在映射的最后使用ReverseMap()方法即可:

using AutoMapper;using AutoMapperDemo.DTO;using AutoMapperDemo.Model;namespace AutoMapperDemo.AutoMapper{    /// <summary>    /// 继承自Profile类    /// </summary>    public class StudentProfile: Profile    {        /// <summary>        /// 构造函数中实现映射        /// </summary>        public StudentProfile()        {            // Mapping            // 第一次参数是源类型(这里是Model类型),第二个参数是目标类型(这里是DTO类型)            // CreateMap<Student, StudentDTO>();            // 使用自定义映射 Student类的ID映射到StudentDTO类的StudentID            //CreateMap<Student, StudentDTO>()            //    .ForMember(destinationMember: des => des.StudentID, memberOptions: opt => { opt.MapFrom(mapExpression: map => map.ID); });            // 对多个属性进行自定义映射            CreateMap<Student, StudentDTO>()                .ForMember(destinationMember: des => des.StudentID, memberOptions: opt => { opt.MapFrom(mapExpression: map => map.ID); })                .ForMember(destinationMember: des => des.StudentName, memberOptions: opt => { opt.MapFrom(mapExpression: map => map.Name); })                .ForMember(destinationMember: des => des.StudentAge, memberOptions: opt => { opt.MapFrom(mapExpression: map => map.Age); })                .ForMember(destinationMember: des => des.StudentGender, memberOptions: opt => { opt.MapFrom(mapExpression: map => map.Gender); })                // ReverseMap表示双向映射                .ReverseMap();        }    }}

我们修改Data,里面增加一个Add方法,可以将Student添加到集合中:

using AutoMapperDemo.Model;using System.Collections.Generic;namespace AutoMapperDemo{    public class Data    {        public static List<Student> ListStudent { get; set; }        static Data()        {            ListStudent = new List<Student>();            for (int i = 0; i < 3; i++)            {                Student student = new Student()                {                    ID = i,                    Name = $"测试_{i}",                    Age = 20,                    Gender = "男"                };                ListStudent.Add(student);            }        }        public static List<Student> GetList()        {            return ListStudent;        }        public static void Add(Student entity)        {            ListStudent.Add(entity);        }    }}

修改Student控制器,添加一个Post方法,传入的参数的StudentDTO类型:

using System.Collections.Generic;using System.Threading.Tasks;using AutoMapper;using AutoMapperDemo.DTO;using AutoMapperDemo.Model;using Microsoft.AspNetCore.Mvc;namespace AutoMapperDemo.Controllers{    [Route("api/[controller]")]    [ApiController]    public class StudentController : ControllerBase    {        private readonly IMapper _mapper;        /// <summary>        /// 通过构造函数实现依赖注入        /// </summary>        /// <param name="mapper"></param>        public StudentController(IMapper mapper)        {            _mapper = mapper;        }        [HttpGet]        public async Task<List<Student>> Get()        {            List<Student> list = new List<Student>();            list = await Task.Run<List<Student>>(() =>             {                return Data.GetList();            });            return list;        }        [HttpGet("GetDTO")]        public async Task<List<StudentDTO>> GetDto()        {            List<StudentDTO> list = new List<StudentDTO>();            List<Student>  listStudent = await Task.Run<List<Student>>(() =>            {                return Data.GetList();            });            //// 循环给属性赋值            //foreach (var item in listStudent)            //{            //    StudentDTO dto = new StudentDTO();            //    dto.ID = item.ID;            //    dto.Name = item.Name;            //    dto.Age = item.Age;            //    dto.Gender = item.Gender;            //    // 加入到集合中            //    list.Add(dto);            //}            // 使用AutoMapper进行映射            list = _mapper.Map<List<StudentDTO>>(listStudent);            return list;        }        [HttpPost]        public async Task<List<Student>> Post([FromBody]StudentDTO entity)        {            List<Student> list = new List<Student>();            // 将StudentDTO反向映射为Student类型            Student student = _mapper.Map<Student>(entity);            // 添加到集合中            Data.Add(student);            // 返回增加后的数组,这里返回Student            list = await Task.Run<List<Student>>(() =>            {                return Data.GetList();            });            return list;        }    }}

使用Postman进行测试:

ASP.NET Core如何使用AutoMapper实现实体映射

返回结果:

ASP.NET Core如何使用AutoMapper实现实体映射

这样就实现了映射的反转。

关于“ASP.NET Core如何使用AutoMapper实现实体映射”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

ASP.NET Core如何使用AutoMapper实现实体映射

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

ASP.NET Core如何使用AutoMapper实现实体映射

这篇文章将为大家详细讲解有关ASP.NET Core如何使用AutoMapper实现实体映射,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、前言在实际的项目开发过程中,我们使用各种ORM框架可以使我们快
2023-06-29

Entity Framework Core如何实现表名映射

小编给大家分享一下Entity Framework Core如何实现表名映射,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!表名映射我们知道:如果是在默认情况下,使用EFCore Code First的方式生成的表名跟数据上
2023-06-29

php如何实现映射

小编给大家分享一下php如何实现映射,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!映射映射,或者射影,在数学及相关的领域经常等同于函数。基于此,部分映射就相当于部
2023-06-06

ASP.NET CORE如何实现跨域

本篇内容主要讲解“ASP.NET CORE如何实现跨域”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“ASP.NET CORE如何实现跨域”吧!一、后台API接口用.net core创建一个Web
2023-06-29

ASP.NET Core实时库SignalR如何使用

这篇文章主要讲解了“ASP.NET Core实时库SignalR如何使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“ASP.NET Core实时库SignalR如何使用”吧!何为实时先从理
2023-06-26

如何使用AutoMapper实现GET请求

这篇文章主要讲解了“如何使用AutoMapper实现GET请求”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何使用AutoMapper实现GET请求”吧!需求需求很简单:实现GET请求获取
2023-06-22

mybatis如何实现继承映射

目录mybatis 继承映射类图三个实体类的代码分析mybatis xml映射文件的继承问题1、首先dao层mapper.java需要继承原来的接口  2、继承原始mapper.xml的结果映射   mybatis 继承映射ORM框架的优势在于能让我们利用面向
2017-01-08

ASP.NET Core如何使用Log4net实现日志记录功能

这篇文章主要介绍“ASP.NET Core如何使用Log4net实现日志记录功能”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“ASP.NET Core如何使用Log4net实现日志记录功能”文章能帮
2023-06-29

在Linux系统下如何使用SSH实现端口映射

这篇文章主要介绍“在Linux系统下如何使用SSH实现端口映射”,在日常操作中,相信很多人在在Linux系统下如何使用SSH实现端口映射问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”在Linux系统下如何使用
2023-06-13

ASP.NET Core中如何实现重定向详解

前言 ASP.NET Core 是一个跨平台,开源的,轻量级的,模块化的,用于构建高性能的 web 开发框架, ASP.NET Core MVC 内置了多种方式将一个 request 请求跳转到指定的url,这篇文章我们就来讨论如何去实现。
2022-06-07

MacOS下如何实现docker端口映射

这篇文章给大家分享的是有关MacOS下如何实现docker端口映射的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。MacOS上的Docker网络结构图从里到外的顺序是:容器->boot2docker(虚拟机)->物
2023-06-19

Python使用mmap如何实现内存映射文件操作

这篇文章给大家分享的是有关Python使用mmap如何实现内存映射文件操作的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。说明 1)什么叫映射?   ==>就是给一个对象(可以是变量、物理等),起一个唯一的别名,建
2023-06-15

ASP.NET Core通用主机如何实现托管服务

本文小编为大家详细介绍“ASP.NET Core通用主机如何实现托管服务”,内容详细,步骤清晰,细节处理妥当,希望这篇“ASP.NET Core通用主机如何实现托管服务”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧
2023-07-02

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录