.net6API使用AutoMapper和DTO

news2024/11/18 1:23:17

        AutoMapper,是一个转换工具,说到AutoMapper时,就不得不先说DTO,它叫做数据传输对象(Data Transfer Object)。

 

        通俗的来说,DTO就是前端界面需要用的数据结构和类型,而我们经常使用的数据实体,是数据库需要用的数据结构和类型,它们2者负责的方向不一样,经常需要进行转化,那么此时AutoMapper就是一个转换工具,它可以对数据实体和前端界面的数据进行转换,反之,也可以,这样就加大了转换的效率,如果不用AutoMapper时,我们需要自己手写转换,AutoMapper的目的就是提高转换效率,不用写更多的判断代码了。

官网如下:

Getting Started Guide — AutoMapper documentation

1.创建一个可以运行的.net6API程序

然后安装AutoMapper

2. 建立一个Model文件夹,2个实体数据,没有什么意义,后面用于转换

A.cs

namespace AutoMapperDemo.Model
{
    public class A
    {
        public int id { get; set; }
        public string? name { get; set; }

        public int age { get; set; }
        public DateTime birthday { get; set; }
    }
}

B.cs 

namespace AutoMapperDemo.Model
{
    public class B
    {
        public int id { get; set; }
        public string ? school { get; set; }

        public int code { get; set; }
    }
}

3. 建立一个Profile文件夹,2个Dto实体数据,字段可以不一样,也可以一样,和之前的Model进行转换

dto里面的字段,就是前端需要显示的字段

ADto.cs

namespace AutoMapperDemo.Model
{
    public class ADto
    {
        //wpf中可以集成INotifyPropertyChanged
        public int id { get; set; }
        public string? nameA { get; set; }

        public int ageA { get; set; }
        public DateTime birthdayA { get; set; }
    }
}

BDto.cs

namespace AutoMapperDemo.Model
{
    public class BDto
    {
        //wpf中可以集成INotifyPropertyChanged
        public int id { get; set; }
        public string ? schoolB { get; set; }

        public int codeB { get; set; }
    }
}

4. 建立AutoMapperProFile.cs

此文件最重要,里面都是对实体类和DTO进行配置的,相互转换的。

using AutoMapper;
using AutoMapperDemo.Model;

namespace AutoMapperDemo.Profile
{
    public class AutoMapperProFile : MapperConfigurationExpression
    {
        //此文件的作用是,手动增加配置文件,项目中需要什么,就加什么,并且对字段进行映射匹配
        public AutoMapperProFile()
        {
            //映射关系
            //CreateMap<A, ADto>();//如果A和ADto一样,那么直接可以直接转换,不需要指定字段了
            CreateMap<A, ADto>().
                ForMember(a => a.birthdayA, b => b.MapFrom(b => b.birthday))
                .ForMember(a => a.nameA, b => b.MapFrom(b => b.name))
                .ReverseMap();//ForMember指定转换的字段值,ReverseMap()意思是互相转换
            //CreateMap<A, ADto>().ForAllMembers(a => a.Ignore());
            //  CreateMap<B, BDto>().ReverseMap();
        }
    }
}

5.最后在Program.cs中注入

整体项目文件

 

using AutoMapper;
using AutoMapperDemo.Profile;

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

            // Add services to the container.

            builder.Services.AddControllers();
            // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
            builder.Services.AddEndpointsApiExplorer();
            builder.Services.AddSwaggerGen();

            //添加AutoMapper
            var automapperConfig = new MapperConfiguration(config =>
            {
                config.SourceMemberNamingConvention = new LowerUnderscoreNamingConvention();   //Camel命名与Pascal命名的兼容,配置之后会映射property_name到PropertyName
                config.DestinationMemberNamingConvention = new PascalCaseNamingConvention();
                config.AddProfile(new AutoMapperProFile());
            });
            builder.Services.AddSingleton(automapperConfig.CreateMapper()); //只有一个单例

            var app = builder.Build();

            // Configure the HTTP request pipeline.
            if (app.Environment.IsDevelopment())
            {
                app.UseSwagger();
                app.UseSwaggerUI();
            }

            app.UseHttpsRedirection();

            app.UseAuthorization();


            app.MapControllers();

            app.Run();
        }
    }
}

6.使用,如图所示

  

using AutoMapper;
using AutoMapperDemo;
using AutoMapperDemo.Model;
using Microsoft.AspNetCore.Mvc;
using System.Reflection;

namespace AutoMapperDemo.Controllers
{
    [ApiController]
    [Route("[controller]")]
    public class WeatherForecastController : ControllerBase
    {
        private static readonly string[] Summaries = new[]
        {
        "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
    };

        private readonly ILogger<WeatherForecastController> _logger;
        private readonly IMapper mapper;  //注入

        public WeatherForecastController(ILogger<WeatherForecastController> logger, IMapper mapper)
        {
            _logger = logger;
            this.mapper = mapper;
        }

        [HttpGet(Name = "GetWeatherForecast")]
        public IEnumerable<WeatherForecast> Get()
        {
            //将数据库的实体A,转化成界面需要的ADto,最终aDto是需要的值
            A a = new A()
            {
                age = 1,
                birthday = DateTime.Now,
                id = 1,
                name = "张三"
            };
            var aDto = mapper.Map<ADto>(a);

            //将界面的数据ADto,转换成实体A,最终a1是需要的值
            ADto adto = new ADto()
            {
                ageA = 2,
                birthdayA = DateTime.Now.AddDays(2),
                id = 2,
                nameA = "李四"
            };
            var a1 = mapper.Map<A>(adto);

            return Enumerable.Range(1, 5).Select(index => new WeatherForecast
            {
                Date = DateTime.Now.AddDays(index),
                TemperatureC = Random.Shared.Next(-20, 55),
                Summary = Summaries[Random.Shared.Next(Summaries.Length)]
            })
            .ToArray();
        }
    }
}

总结:AutoMapper还有一些复杂的转换,这一切的转换规则,都是根据业务来说的,业务简单,甚至不用AutoMapper也可以。主要就是在AutoMapperProFile文件中,进行修改和增加,以及使用的地方修改和增加。大部分都是2实体和DTO之间字段的匹配方式,值的转换等等操作。

源码:https://download.csdn.net/download/u012563853/87454728

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

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

相关文章

华为ensp模拟校园网/企业网实例(同城灾备及异地备份中心保证网络安全)

文章简介&#xff1a;本文用华为ensp对企业网络进行了规划和模拟&#xff0c;也同样适用于校园、医院等场景。如有需要可联系作者&#xff0c;可以根据定制化需求做修改。作者简介&#xff1a;网络工程师&#xff0c;希望能认识更多的小伙伴一起交流&#xff0c;私信必回。一、…

多元回归分析 | CNN-LSTM卷积长短期记忆神经网络多输入单输出预测(Matlab完整程序)

多元回归分析 | CNN-LSTM卷积长短期记忆神经网络多输入单输出预测(Matlab完整程序) 目录 多元回归分析 | CNN-LSTM卷积长短期记忆神经网络多输入单输出预测(Matlab完整程序)预测结果评价指标基本介绍程序设计参考资料预测结果 评价指标 训练集平均绝对误差MAE:0.69559 训练…

宝塔搭建实战php源码人才求职管理系统后台端thinkphp源码(一)

大家好啊&#xff0c;我是测评君&#xff0c;欢迎来到web测评。 在开源社区里看到了这一套系统&#xff0c;骑士人才系统SE版&#xff0c;搭建测试了&#xff0c;感觉很不错。能够帮助一些想做招聘平台的朋友降低开发成本&#xff0c;就是要注意&#xff0c;想商业使用的话&…

QT+OpenGL光照2

QTOpenGL材质 本篇完整工程见gitee:QtOpenGL 对应点的tag&#xff0c;由turbolove提供技术支持&#xff0c;您可以关注博主或者私信博主 材质 在现实世界中&#xff0c;每个物体会对光照产生不同的反应 在OpenGL中模拟多种类型的物体&#xff0c;必须为每种物体分别定义一个…

IO模型--从BIO、NIO、AIO到内核select、poll、epoll剖析

IO基本概述 IO的分类 IO以不同的维度划分&#xff0c;可以被分为多种类型&#xff1b;从工作层面划分成磁盘IO&#xff08;本地IO&#xff09;和网络IO&#xff1b; 也从工作模式上划分&#xff1a;BIO、NIO、AIO&#xff1b;从工作性质上分为阻塞式IO与非阻塞式IO&#xff1b…

低代码/零代码的快速开发框架

目前国内主流的低代码开发平台有&#xff1a;宜搭、简道云、明道云、云程、氚云、伙伴云、道一云、JEPaaS、华炎魔方、搭搭云、JeecgBoot 、RuoYi等。这些平台各有优劣势&#xff0c;定位也不同&#xff0c;用户可以根据自己需求选择。 一、阿里云宜搭 宜搭是阿里巴巴集团在20…

分布式文件存储Minio学习入门

文章目录一、分布式文件系统应用场景1. Minio介绍Minio优点2. MinIO的基础概念、3. 纠删码ES(Erasure Code)4. 存储形式5. 存储方案二、Docker部署单机Minio三、minio纠删码模式部署四、分布式集群部署分布式存储可靠性常用方法冗余校验分布式Minio优势运行分布式minio使用dock…

如何设置股票接口版交易软件的指标涨跌家数?

如何设置股票接口版交易软件指标涨跌家数&#xff1f;今天小编就以通达信为例给大家介绍一下&#xff0c;很多人其实不知道通达信里面有个很厉害的股票情绪的指标&#xff0c;叫做通达信涨跌家数&#xff0c;打开在通达信软件k线界面&#xff0c;然后输入880005就可以找到了。下…

如何解决 Python 中 TypeError: unhashable type: ‘dict‘ 错误

Python “TypeError: unhashable type: ‘dict’ ” 发生在我们将字典用作另一个字典中的键或用作集合中的元素时。 要解决该错误&#xff0c;需要改用 frozenset&#xff0c;或者在将字典用作键之前将其转换为 JSON 字符串。 当我们将字典用作另一个字典中的键时&#xff0c…

AnlogicFPGA-IO引脚约束设置

&#xff08;https://www.eefocus.com/article/472120.html此链接是一篇关于XillinxFPGA的IO的状态分析&#xff0c;希望自己也要能了解到AnLogic的IO状态并有对此问题的分析能力&#xff09; 1、DriveStrength: 驱动强度&#xff0c;即最大能驱动的电流大小&#xff08;见带负…

Project Caliper:目标是打造最佳VR手柄

一提到Valve Index&#xff0c;人们很快联想到它的五指追踪VR手柄&#xff0c;这款支持手势追踪和体感反馈的高端VR手柄&#xff0c;是市面上最强大的C端VR手柄之一。尽管如此&#xff0c;它依然存在许多缺陷&#xff0c;比如配备的小型摇杆质量不佳、集成式设计不利于维修、人…

算法问题——排序算法问题

摘要 查找和排序算法是算法的入门知识&#xff0c;其经典思想可以用于很多算法当中。因为其实现代码较短&#xff0c;应用较常见。所以在面试中经常会问到排序算法及其相关的问题。但万变不离其宗&#xff0c;只要熟悉了思想&#xff0c;灵活运用也不是难事。一般在面试中最常…

布林线(BOLL)计算公式详解,开口收口代表什么

布林带&#xff0c;英文名称BOLL&#xff0c;是John Bollinger在上世纪八十年代创建的&#xff0c;由中轨、上轨、下轨三条线组成。 一、布林线计算公式详解 布林线中轨是简单移动平均线&#xff0c;一般软件上自带的布林带中轨是20日均线&#xff0c;上轨是中轨加上2个标准差…

Spring 系列之FrameWork

Spring 系列文章 文章目录Spring 系列文章前言一、Spring 介绍二、Spring 架构特征三、Spring 优势四、Spring 体系结构五、IOC 控制反转1. 概念引入2. 原理分析六、Bean 管理1. 介绍2. 管理的内容3. Bean 管理方式1. XML实现DI 赋值2. Bean生命周期1. 测试生命周期2. 后置处理…

RuoYi-Vue搭建(若依)

项目简介 RuoYi-Vue基于SpringBootVue前后端分离的Java快速开发框架1.前端采用Vue、Element UI2.后端采用Spring Boot、Spring Security、Redis & Jwt3.权限认证使用Jwt&#xff0c;支持多终端认证系统4.支持加载动态权限菜单&#xff0c;多方式轻松权限控制5.高效率开发&a…

27岁想转行IT,还来得及吗?

来不来得及不还是看你自身的意愿和条件&#xff0c;这个问题要问你自己吧&#xff01; 每个人的能力、看法都不同。面对类似的问题&#xff0c;很多人会把侧重点放在IT上&#xff0c;或者27岁上面。那么我们试着换一个方式来问呢&#xff1a;什么时候适合转行&#xff0c;有哪些…

1.PostgreSQL

文章目录LIMITWITH 和RECURSIVEPostgreSQL 约束PostgreSQL AUTO INCREMENT&#xff08;自动增长&#xff09;PostgreSQL PRIVILEGES&#xff08;权限&#xff09;GRANT语法LIMIT SELECT * FROM COMPANY LIMIT 3 OFFSET 2;WITH 和RECURSIVE WITH RECURSIVE t(a,b) AS (VALUES (…

每日学术速递2.16

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CV 1.Efficient Teacher: Semi-Supervised Object Detection for YOLOv5 标题&#xff1a;高效教师&#xff1a;YOLOv5 的半监督目标检测 作者&#xff1a;Bowen Xu, Mingtao Chen, Wen…

用ChatGPT来预测2023美国大学生数学建模赛题以及高分攻略

一.2023年美赛 2023年美赛将于2023年2月17-21日举行&#xff0c;将会在北京时间&#xff1a;2023年2月 21日&#xff0c;上午10&#xff1a;00前提交论文。 二.用ChatGPT来预测2023美国大学生数学建模赛题 2.1预测一下会有什么类型的题目 答&#xff1a; 由于我是一个人工…

AcWing语法基础课笔记 第五章 C++中的字符串

第五章 C中的字符串 字符串是计算机与人类沟通的重要手段。 ——闫学灿 字符与整数的联系——ASCII码 每个常用字符都对应一个-128~127的数字&#xff0c;二者之间可以相互转化&#xff1a; 常用ASCII值&#xff1a;’A’-‘Z’ 是65~90&#xff0c;’a’-‘z’…