.net6API使用AutoMapper和DTO

2023-05-16

        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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

.net6API使用AutoMapper和DTO 的相关文章

  • 我应该如何为 Unity 和 AutoMapper 实现 MVC Bootstrapper?

    为我的 MVC 2 应用程序创建引导程序的最佳方法是什么 我正在使用 Unity 和 AutoMapper 并希望尽可能抽象它们的加载和配置 一个不错的例子在这里 http weblogs asp net rashid archive 20
  • 自动映射器有什么用?

    What s 自动映射器 http www codeplex com AutoMapper for 它将如何帮助我处理域和控制器层 asp net mvc 也许一个例子会有所帮助 假设您有一个很好标准化的数据库模式 如下所示 Orders
  • 使用 Automapper 忽略子类映射中的基类属性的问题

    我有一个场景 我想忽略基类中定义的类的某些属性 我有一个像这样的初始映射 Mapper CreateMap
  • Automapper 地图自定义集合

    Hello 我有一个看起来像这样的列表 public class PagedList
  • AutoMapper,如何保持映射对象之间的引用?

    我使用 AutoMapper 将 UI 模型转换为 POCO 然后使用 DataContractSerializer 将其序列化为 XML 以便保留它们之间的引用 问题来了 在绘制地图时 这些实体之间的引用丢失 UI 类相互引用 但映射过程
  • Automapper v5 忽略未映射的属性

    以前 当我使用 Automapper v3 x 时 只需添加一个即可忽略未映射的属性 IgnoreUnmappedProperties 扩展看起来像这样 public static class AutoMapperExtensions pu
  • REST API - 是否 DTO? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我目前正在为一个项目创建 REST API 并且一直在阅读有关最佳实践的文章 许多人似乎反对 DTO 只是简单地公开域模型 而其他人似乎认为 D
  • 定义 CreateProjection 和 CreateMap

    在我的项目中 我使用实体框架进行 ORM 使用 Dto 类进行 api 响应 我使用 Automapper 在两者之间进行映射 当我需要直接从 EF 可查询中获取 Dtos 时 我会执行最后的操作ProjectTo lt gt 根据我的查询
  • Automapper - 字典到对象映射不起作用?

    我正在尝试将字典转换为对象 我已经尝试过以下方法 但它不起作用 public class FormField public string FieldName get set public string FieldValue get set
  • AutoMapper 排除字段

    我正在尝试将一个对象映射到另一个对象 但该对象非常复杂 在开发过程中 我希望能够排除一堆字段并逐一访问它们 或者能够指定仅映射我想要的字段 并在每次测试成功时增加字段 So class string field1 string field2
  • 如何在不使用 AutoMapper 的情况下手动映射 DTO?

    我正在学习 C NET Core 并尝试在不使用 AutoMapper 的情况下创建 DTO 映射 因为我正在独自开发一个小项目 并且想在使用额外的包之前了解基础知识 令人惊讶的是我无法在 stackoverflow com 上轻松找到答案
  • 自动映射器表达式必须解析为顶级成员

    我正在使用自动映射器来映射源对象和目标对象 当我映射它们时 我收到以下错误 表达式必须解析为顶级成员 参数名称 lambda表达式 我无法解决这个问题 我的源对象和目标对象是 public partial class Source priv
  • 实体框架、AutoMapper、处理实体更新

    我最近才开始使用Entity Framework 1 0 相信我已经开始感受到大家都在谈论的痛苦了 我正在尝试使用最佳实践 因此我有一组 DTO 可以通过 AutoMapper 映射到我的实体或从我的实体映射 真正的问题是当我尝试更新对象时
  • DTO 接口

    我目前正在开始开发一个大型 Web 应用程序 主要包含 Angular SPA 和可以访问后端层的 OData WebAPI 我们正处于早期阶段 并已开始实施第一批课程 包括Model dll它位于公共名称空间中 以便所有层都可以访问它 我
  • 使用 AutoMapper 进行集合的多态映射

    TL DR 我在多态映射方面遇到了麻烦 我已经制作了一个 github 存储库 其中包含一个测试套件来说明我的问题 请在这里找到它 回购链接 https github com 780Farva AutoMapperInquiry 我正在努力
  • 如何在 Automapper 中使用数据集?

    我目前使用数据读取器作为源 但我想改用数据集 datareader AutoMapper Mapper CreateMap
  • Automapper实体框架外键为空

    我正在尝试使用实体框架更新数据库 我使用自动映射器将实体映射到视图模型 并以相同的方式将其映射回来 HttpPost ValidateAntiForgeryToken public ActionResult Edit FromJson My
  • 如何使用AutoMapper按照类中定义的顺序映射对象?

    给定这两个对象 我使用非常不同的对象来更好地阐明 public class Car public string Brand get set public int Speed get set public class Apple public
  • AutoMapper 2.0 中的 ITypeConverter 接口已更改

    ITypeConverter 接口已更改为 Convert 方法具有 TDestination Convert ResolutionContext context 而不是 TDestination Convert TSource sourc
  • 具有子列表属性映射问题的自动映射器

    我有以下型号 Models public class Dish Required public Int64 ID get set Required public string Name get set Required public str

随机推荐

  • [零刻]EQ12 N100 迷你主机:从开箱到安装ESXi+虚拟机

    开箱先上图 xff1a 配置详情 xff1a EQ12采用了Intel最新推出的N100系列的处理 xff0c 超低的功耗 xff0c 以及出色的CPU性能用来做软路由或者是All in one 相当不错 x
  • [零刻]EQ12迷你主机设置来电开机自启教程

    EQ12 来电自启需通过BIOS设置 断电前开机状态则来电后自动开机 xff0c 关机状态则不会自动开机 操作步骤 xff1a 1 首先关闭主机 xff0c 按下电源后 xff0c 当屏幕出现logo后 xff0c 迅速按下键盘上的Del键
  • C语言习题:字符串操作函数练习题目

    1 将包含字符数字的字符串分开 使得分开后的字符串前一部分是数字后一部分是字母 例如 h1ell2o3 gt 123hello span class token macro property span class token directi
  • Java单元测试实践-08.Stub、Replace、Suppress静态方法

    Java单元测试实践 00 目录 xff08 9万多字文档 43 700多测试示例 xff09 https blog csdn net a82514921 article details 107969340 1 Stub Replace S
  • [零刻]EQ12安装PVE虚拟机教程

    PVE虚拟机简介 Proxmox VE是一个运行虚拟机和容器的平台 基于Debian Linux xff0c 完全开源 为了获得最大的灵活性 xff0c 实现了两种虚拟化技术 基于内核的虚拟机 KVM 和基于容器的虚拟化 LXC 一个主要的
  • [零刻]EQ12&EQ12Pro安装OpenWRT软路由教程

    OpenWRT系统安装 安装前准备 1 U盘一个 2 WePE写盘工具 3 Openwrt固件 4 Img镜像写盘工具 安装步骤 xff1a 1 首先下载WePE写盘工具 xff0c 制作一个PE系统安装环境 xff0c 启动软件后 xff
  • [零刻]EQ12&EQ12Pro安装原厂系统教程

    有些小伙伴购买的准系统的版本因为不带内存和硬盘 xff0c 需要自己进行安装系统 xff0c 对于小白来说还是比较困难的 xff0c 在这里推荐大家使用原厂的系统 xff0c 里面自带驱动安装好后就可以直接使用 使用原厂系统包安装步骤 xf
  • Esxi8.0安装Ubuntu系统教程

    本篇教程主要教大家怎么在ESXi8 0虚拟机上安装Ubuntu系统 xff0c 首先安装Ubuntu需要准备一个ISO系统镜像文件 xff0c 我们可以去Ubuntu官网下载 Ubuntu官网 xff1a https ubuntu com
  • [零刻]EQ12&EQ12Pro调整风扇转速教程

    调整 CPU 风扇转速可以有不同的用途 xff0c 具体取决于您的计算机和使用情况 降低噪音 xff1a 如果您的风扇的噪音很大 xff0c 可以通过降低 CPU 风扇的转速来减少噪音 这可以通过在 BIOS 或中设置 CPU 风扇转速控制
  • [零刻]EQ12&EQ12Pro调整最低功耗教程

    在使用EQ12作为软路由的时候 xff0c 因为要不间断工作 xff0c 功耗就非常关键了 xff0c 所以并不需要太高的功耗 xff0c 所以接下来我教你怎么设置以最低功耗运行 具体操作步骤 xff1a 1 先关闭电脑 xff0c 按下电
  • 动态更新阿里云DDNS解析记录的IPv6地址,随时随地用域名远程访问自己的电脑【如何远程访问家里的电脑】

    远程访问电脑 日志简介要求1 IPv6网络1 1检查光猫是否支持IPv61 2检查路由器是否支持并开启IPv6 xff08 没有路由器的跳过这一步 xff09 1 3配置电脑防火墙1 3 1允许ICMPv6协议通过防火墙1 3 2文件共享S
  • 一个好用的js压缩加密网站

    js加密网站 我是vue的js xff0c 用了好几个加密网站得出的结果会有错 xff0c 这个挺好
  • alibaba pc safe service无法删除,一直在后台运行怎么办?

    对付流氓软件 xff0c 应当使用师夷长技以制夷的办法 xff0c 下载一个腾讯电脑管家 xff0c 然后下载里面的文件粉碎机 xff0c 在任务管理器找到对应的alibaba pc safe service服务 xff0c 点击进入具体的
  • APP流量变现之穿山甲广告平台接入

    1 首先百度搜索 穿山甲广告投放 xff0c 第一个出现的链接就是开发者官网 xff0c 截图如下 xff1a 2 进入之后点击注册 xff0c 然后登陆 xff08 这一步穿山甲超级简单 xff0c 如果不着急提现收益的话 xff0c 可
  • spss统计分析基础教程(上)--自学

    64 TOC 目录 xff09 第一章 四种窗口 数据窗口 输出窗口 语法窗口 脚本窗口 菜单 1 文件 xff1a 新建 打开 保存 另存为 将文件标记为只读 xff1a 如果之后保存文件 xff0c 则只能重命名并另存 重新命名数据集
  • OpenWrt 内的阿里云盘 WebDAV 做磁盘使用

    最近在玩OpenwWrt的时候 xff0c 在刷的固件里看到预装的阿里云盘 WebDAV xff0c 加上最近刚刚开始用阿里云 xff0c 不限速 xff0c 非常快 xff0c 通过这个服务 xff0c 可以直接把阿里云的文件架挂载在本地
  • VS2022中使用Copilot

    Copilot可以自动帮你写代码 1 打开vs2022 点击扩展 xff0c 在里面搜索copilot安装 2 安装完成后 xff0c 左下角有个小图标就是copilot 3 点击登录 会弹框 点击确定后 xff0c 跳转到网站 xff0c
  • CSS/SCSS/LESS和自适应布局/响应式布局详解

    在开发前端的时候 xff0c 界面布局尤为重要 xff0c 要布局的非常合理 xff0c 好看 xff0c css是必不可少的 xff0c 然后是各种布局 xff0c 使用这些布局 xff0c 进行混合搭配 xff0c 最终的目的都是开发一
  • 响应式布局之viewport-超级简单

    之前文章CSS布局之详解 故里2130的博客 CSDN博客 上面的文章可以实现响应式布局 xff0c 根据浏览器的大小变化而变化 xff0c 但是相对于viewport来说 xff0c 之前的还是有点复杂 xff0c 而使用viewport
  • .net6API使用AutoMapper和DTO

    AutoMapper xff0c 是一个转换工具 xff0c 说到AutoMapper时 xff0c 就不得不先说DTO xff0c 它叫做数据传输对象 Data Transfer Object 通俗的来说 xff0c DTO就是前端界面需