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中可以集成INotifyPropertyChangedpublic 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中可以集成INotifyPropertyChangedpublic 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/swashbucklebuilder.Services.AddEndpointsApiExplorer();builder.Services.AddSwaggerGen();//添加AutoMappervar automapperConfig = new MapperConfiguration(config =>{config.SourceMemberNamingConvention = new LowerUnderscoreNamingConvention();   //Camel命名与Pascal命名的兼容,配置之后会映射property_name到PropertyNameconfig.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

.net6API使用AutoMapper和DTO相关推荐

  1. 简单使用AutoMapper实现DTO转换

    DTO(Data Transfer Object)数据传输对象,只是传输数据,完成与领域对象之间的转换,并不包含领域业务处理. 当领域模型设计人员只关注核心业务,满足于领域模型的精巧,而不关心具体实现 ...

  2. 使用AutoMapper 处理DTO数据对象的转换

    using AutoMapper; using System; namespace DTOtEST { class Program { static void Main(string[] args) ...

  3. 理解什么是DTO?什么是AutoMapper?

    什么是DTO? .Net DTO是一个对象,它定义了数据如何在网络上发送.它只用于发送和接收数据,不包含任何业务逻辑.使用DTO的原因有以下几个: 将服务层与数据库层分离 隐藏客户端不需要查看的特定属 ...

  4. 结婚虽易,终老不易:EntityFramework和AutoMapper的婚后生活

    写在前面 我到底是什么? 越界的可怕 做好自己 后记 上一篇<恋爱虽易,相处不易:当EntityFramework爱上AutoMapper>文章的最后提到,虽然AutoMapper为了En ...

  5. Automapper如何全局配置map条件过滤null值空值对所有映射起效

    我们在使用automapper的时候经常会遇到这样的问题:假设展示给用户的数据我们用UserDto类,User类就是我们的实体类.在给用户编辑的时候,我们可能某些字段在数据库中为Null,这时候需要一 ...

  6. 基于ZKWeb + Angular 4.0的开源管理后台Demo

    这是一套基于ZKWeb网页框架和Angular 4.0编写的开源管理后台Demo,实现了前后端分离和模块化开发, 地址是: https://github.com/zkweb-framework/ZKW ...

  7. go编译库给c语言函数返回值,go语言 函数return值的几种情况

    IOS开发基础知识--碎片36 1:tabBarController跳转到另一个一级页面 当我们用tabBarController时,若已经到其中一个TabBar的子页,又要跳转到某一个一级的页面时, ...

  8. hibernate oracle 读写分离_ASP.NET CORE 国产最火前后端完全分离框架BCVP

    BCVP(Blog.Core&Vue Project)是.NET界开箱即用的企业级前后端分离[ .NET Core3.1 Api + Vue 2.x + RBAC]权限框架,由国内微软MVP& ...

  9. c# ef报错_关于c#:在EF 6中更新现有数据会引发异常-“…同一类型的实体已经具有相同的主键值。”...

    我正在尝试使用Entity Framework 6,代码优先,没有流畅的映射或类似Automapper的工具来更新记录. 实体(Employee)具有与其关联的其他复合属性,例如Addreess(co ...

最新文章

  1. 【Android 插件化】基于插件化引擎的“恶意应用“与“良性应用“区别 | 恶意插件化应用特征
  2. Windows Subsystem for Linux (WSL)简单尝试
  3. java逻辑代码_Java逻辑代码判断字数
  4. Mongoose 中使用 populate 实现关联查询
  5. Unreal Engine 4 —— 使用ProceduralMeshComponent实现模型实时切割
  6. Android studio Mac 版上传代码提示The subversion command line tools are no longer provided by Xcode
  7. 01-eclipse打包运行程序总是报错java.lang.NoClassDefFoundError和ava.lang.ClassNotFoundException(打包原理)
  8. @程序员,多写点“坏”代码吧!
  9. vue-cli 做前端+ nodejs做服务端的 IIS部署
  10. delphi mysql 连接_Delphi 使用之连接数据库
  11. 一带一路”建设的助力者——刘岳霖
  12. TYUT太原理工大学2022需求工程考试选择题背诵版
  13. ChucK初步(9)
  14. 用Python分析北京蛋壳公寓租房数据
  15. python语言程序设计计算机二级难不难_python语言程序设计计算机二级难不难_全国计算机二级的难度有多大?...
  16. C#根据出生日期计算年龄的源码
  17. 未来音乐战场:从「听音乐」到「用音乐」
  18. Python中的异常、try、except、finally、raise语法以及示例
  19. PyTorch GPU计算
  20. AWS云平台的服务概览

热门文章

  1. web项目发布到iis中readystate一直处于 interactive_Framer Web 发布后,终于像个正经的设计软件了。...
  2. gunicorn 安装部署详解
  3. 多层循环给数组添加元素重复添加问题
  4. k8s主从自动切换mysql_K8S与Ceph RBD集成-多主与主从数据库示例
  5. ALGOL语言 发展历史
  6. supermap新建数据源_supermap iDesktop 处理数据集及生成场景缓存
  7. 大牛谈如何搞定机器视觉
  8. 浏览器的安全机制\ XSS
  9. C语言strstr()函数用法-字符串查找
  10. Windows XP下如何实现共享上网