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

news2024/9/29 11:31:44

什么是DTO?

 

.Net DTO是一个对象,它定义了数据如何在网络上发送。它只用于发送和接收数据,不包含任何业务逻辑。使用DTO的原因有以下几个:

  • 将服务层与数据库层分离
  • 隐藏客户端不需要查看的特定属性
  • 省略一些属性以减少有效负载大小
  • 处理嵌套对象,使其更方便客户端使用
  • 避免“过度提交”漏洞

什么是过度提交?

过度提交是一种攻击,它利用了MVC的模型绑定功能,向服务器发送额外的数据,以修改不应该被改变的模型属性。例如,如果你有一个表示用户的模型,它包含了用户名、密码和角色等属性,你可能只想让用户在表单中修改自己的密码,而不是角色。但是,如果你不限制模型绑定的范围,一个恶意的用户可以在表单中添加一个角色字段,以改变自己或其他用户的角色。这样就可能导致权限提升、数据泄露或其他安全问题。

 

什么是AutoMapper

AutoMapper是一个简单的库,用于解决一个看似复杂的问题——消除对象之间的映射代码。AutoMapper可以根据约定来匹配源对象和目标对象的属性,自动将一个类型的对象转换为另一个类型的对象。AutoMapper适用于模型投影的场景,可以将复杂的对象模型展平为DTO或其他简单的对象,这些对象的设计更适合序列化、通信、消息传递或作为域和应用层之间的防腐层。

 

AutoMapper优缺点:

AutoMapper有以下一些优点:

  • 它可以节省你编写映射代码的时间,因为它可以根据约定来自动匹配源对象和目标对象的属性。
  • 它可以让你的映射配置更简洁,因为它提供了一些配置选项和扩展方法来自定义映射规则。
  • 它可以让你的映射代码更易于测试,因为它提供了一些测试工具和断言方法来验证映射是否正确。

AutoMapper也有以下一些缺点:

  • 它会降低代码的可导航性,因为你无法通过工具来查找属性的赋值或使用位置,只能通过运行时的反射来确定映射关系。
  • 它会增加重构的风险,因为如果你修改了源对象或目标对象的属性名称或类型,编译器不会报错,但运行时可能会出现异常或错误的映射结果。
  • 它会违背领域驱动开发的原则,因为它鼓励你使用相同或类似的属性名称和类型来实现自动映射,而不是根据领域的需求来设计你的对象模型。
  • 它需要额外的映射验证,因为你不能仅仅依赖于约定来保证映射的正确性,你还需要编写测试或使用验证方法来检查映射配置是否有效。

 

AutoMapper例子:

如果将Model层的实体类作为传输对象,发送给前端时是以Json的格式发送,避免不了会将下面的红色代码也进行Json格式化。前端发送的数据也必须携带List<Book>的Json数据,这样就会很麻烦。

public class BookType

{

    public int Id { get; set; }

    public string TypeName { get; set; }

    public List<Book>? Books { get; set; }

}

public class Book

{

    public int Id { get; set; }

    public string Name { get; set; }

    public DateTime CreatedDate { get; set; }= DateTime.Now;

    public string? Author { get; set; }

    public int? BookTypeId { get; set; }

public BookType? BookType { get; set; }

}

使用AutoMapper框架进行DTO映射

项目目录

在Web Api项目中安装Nuget包

AutoMapper.Extensions.Microsoft.DependencyInjection

在DTO类库中安装Nuget包

AutoMapper

在DTO类库创建DTO类

public class BookDto

{

    public int Id { get; set; }

    public string Name { get; set; }

    public DateTime CreatedDate { get; set; }= DateTime.Now;

    public string? Author { get; set; }

 

    public int? BookTypeId { get; set; }

}

 

public class BookTypeDto

{

    public int Id { get; set; }

    public string TypeName { get; set; }

}

在DTO类库中创建一个类继承Profile

public class BookInfoProfile : Profile

{

    public BookInfoProfile()

    {

        CreateMap<BookDto, Book>();

        CreateMap<BookType, BookTypeDto>();

    }

}

在Web Api项目的Program文件配置AutoMapper

builder.Services.AddAutoMapper(typeof(BookInfoProfile));

控制器使用AutoMapper映射

[Route("api/[controller]/[action]")]

[ApiController]

public class BookController : ControllerBase

{

    private MyContext context;

    private IMapper mapper;

    public BookController(MyContext context, IMapper mapper)

    {

        this.context = context;

        this.mapper = mapper;

    }

 

//添加一个Book数据

    [HttpPost]

    public ActionResult<Book> PostAddBook(BookDto book)

    {

    //BookDto映射为Book,之后添加至数据库中

        Book book1 = mapper.Map<Book>(book);

        context.Books.Add(book1);

        context.SaveChanges();

        return book1;

    }

 

}

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

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

相关文章

【LeetCode: 233. 数字 1 的个数 | 暴力递归=>记忆化搜索=>动态规划 | 数位dp】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

Term Suggester 中 suggest_mode 的三种模式missing、popular、always 的区别

1、Term Suggester term suggester 正如其名&#xff0c;只基于 tokenizer 之后的单个 term 去匹配建议词&#xff0c;并不会考虑多个term之间的关系 POST <index>/_search { "suggest": {"<suggest_name>": {"text": "<s…

VM——VMware装Centos

一、创建虚拟机配置 打开VMware&#xff0c;创建新虚拟机 选择自定义&#xff0c;下一步 选择16.x&#xff0c;然后下一步 选择稍后安装&#xff0c;然后下一步 选择Linux、镜像版本&#xff0c;然后下一步 输入虚拟机名称&#xff0c;选择存放位置&#xff0c;然后下一步 选择…

串口UART介绍

【记录所学】 1. 串口的硬件介绍 UART的全称是Universal Asynchronous Receiver and Transmitter&#xff0c;即异步发送和接收。串口在嵌入式中用途非常的广泛&#xff0c;主要的用途有&#xff1a; 打印调试信息&#xff1b;外接各种模块&#xff1a;GPS、蓝牙&#xff1b…

【java web篇】MyBatis实现增删改查

&#x1f4cb; 个人简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是阿牛&#xff0c;全栈领域优质创作者。&#x1f61c;&#x1f4dd; 个人主页&#xff1a;馆主阿牛&#x1f525;&#x1f389; 支持我&#xff1a;点赞&#x1f44d;收藏⭐️留言&#x1f4d…

Git使用教程:从入门到精通(以Gitee为例)

一、前言 Git是一款分布式版本控制系统&#xff0c;可以帮助开发者更好地管理代码。在众多的Git平台中&#xff0c;Gitee是国内最受欢迎的Git平台之一。本篇文章将介绍如何使用Git进行代码管理&#xff0c;并以Gitee为例&#xff0c;详细讲解Git的基本操作和常用命令。 二、深入…

JS学习笔记(一)

从编程模式看&#xff1a;JS是结构化、事件驱动的动态语言&#xff0c;支持声明式和指令式两种模式&#xff0c;所以JS是一个多模式的语言。面向对象和函数式是常用的两种模式。 函数式编程 基本概念&#xff1a;函数是什么&#xff1f;函数是数据集到目标的一种关系。在函数式…

Windows逆向安全(一)之基础知识(十)

汇编一维数组 之前的文章学习过了四种基本类型&#xff1a;char short int long的汇编表示形式 因为它们的数据宽度都小于等于32位&#xff0c;所以都可以只用一个通用寄存器来存储 接下来的数组显然就无法只用一个通用寄存器就可以存储了 在学习数组之前&#xff0c;再学习…

云可见性和端口欺骗:已知的未知

与所有技术一样&#xff0c;新工具是建立在以前的基础上的迭代&#xff0c;经典的网络日志记录和指标也不例外。 网络流量的工具、检测和监控在私有云和内部部署中几乎没有变化。今天使用的许多日志和指标已有将近二十年的历史&#xff0c;最初是为了解决计费等问题而设计的。…

Node 08-express框架

express 介绍 express 是一个基于 Node.js 平台的极简、灵活的 WEB 应用开发框架&#xff0c;官方网址&#xff1a; https://www.expressjs.com.cn/ 简单来说&#xff0c;express 是一个封装好的工具包&#xff0c;封装了很多功能&#xff0c;便于我们开发 WEB 应用(HTTP 服务)…

强训之【查找组成一个偶数最接近的两个素数和二进制插入】

目录 1.查找组成一个偶数最接近的两个素数1.1题目1.2思路1.2.1 暴力解法1.2.2 取中判断 1.3代码1.3.1暴力求解代码1.3.2 取中判断代码 2.二进制插入2.1题目2.2思路2.3代码 3.选择题 1.查找组成一个偶数最接近的两个素数 1.1题目 链接: link 描述 任意一个偶数&#xff08;大于…

Android学习Day1

Android学习笔记 了解Android 的结构ActivityAndroid中的布局了解安卓的结构ActivityAndroid中的布局代码展示(登录界面的实现)&#xff1a;实现效果&#xff1a;代码展示&#xff08;注册界面的实现&#xff09;实现效果一些之前学习的笔记end 了解Android 的结构 Activity …

服务(第八篇)location和rewrite

常用的Nginx正则表达式: 从功能看&#xff0c;rewrite和location似乎有点像&#xff0c;都能实现跳转&#xff0c;主要区别在于rewrite是在同一域名内更改获取资源的路径&#xff0c;而location是对一类路径做控制访问或反向代理&#xff0c;还可以proxy_pass到其他机器。 rew…

企业如何挑选设备管理系统?

在当今高度竞争的市场环境中&#xff0c;企业需要不断提高生产效率、确保设备的可靠性和安全性以降低运营成本。设备管理系统&#xff08;Equipment Management System&#xff0c;简称EMS&#xff09;是一种帮助企业实现这些目标的有力工具。本文将为您解析企业如何挑选合适的…

提高亚马逊等其他跨境平台的曝光率方法有哪些?

很多卖家都会想尽办法提高自己店铺的曝光率&#xff0c;但有些新手卖家可能不知道曝光率意味着什么 简单来说&#xff0c;曝光率是指你自己的店铺和产品被呈现给顾客的次数&#xff0c;一般来说&#xff0c;曝光率通常决定了你店铺的总流量&#xff0c;交易总量&#xff0c;订…

PM866 3BSE050200R1高压变频器的四种控制方法

PM866 3BSE050200R1高压变频器的四种控制方法 高压变频器装置指驱动输入电源为6&#xff0c;000V或10KV的电机装置&#xff0c;高压变频器一般主要有下列几种方案选择&#xff1a; 一、直接高压控制&#xff08;高成本&#xff09; 目前以采用美国罗宾康类似的无谐波变频技术&a…

凌恩生物美文分享|3月客户文章盘点——累计IF=105,平均IF=8.08

凌恩生物以打造国内一流生物公司为目标&#xff0c;在科研测序领域深耕不辍&#xff0c;吸纳多名在生物信息高级技术人员的加盟&#xff0c;参与并完成多个高科技项目。现已在宏组学、基因组、表观遗传以及蛋白代谢等多组学及联合分析领域积累了深厚经验&#xff0c;打造出成熟…

ASP.NET Core MVC 从入门到精通之布局

随着技术的发展&#xff0c;ASP.NET Core MVC也推出了好长时间&#xff0c;经过不断的版本更新迭代&#xff0c;已经越来越完善&#xff0c;本系列文章主要讲解ASP.NET Core MVC开发B/S系统过程中所涉及到的相关内容&#xff0c;适用于初学者&#xff0c;在校毕业生&#xff0c…

核心业务4:标的管理

核心业务4:标的管理 1.标的管理流程图 2.数据库表设计 3.前端逻辑设计 4.后端逻辑设计 5.标的放款TODO 核心业务4:标的管理 1.标的管理流程图 ①上一个核心业务通过审核借款申请结束

mybatis-plus的代码生成器的应用

目录 1.工程引入mybatis-plus3-generator代码生成器2.只需要关注mybatis-plus-config.properties然后生成代码3.分别添加依赖解决报错4.加入其它配置然后测试效果 3.4版本 1.工程引入mybatis-plus3-generator代码生成器 mybatis-plus3-generator放入项目工程中&#xff0c;父工…