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

news/2024/11/28 10:59:27/

什么是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.ppmy.cn/news/48796.html

相关文章

银行数字化转型导师坚鹏:商业银行数字化风控(1天)

商业银行数字化风控 课程背景&#xff1a; 数字化背景下&#xff0c;很多银行存在以下问题&#xff1a; 不清楚商业银行数字化风控发展现状&#xff1f; 不清楚对公业务数字化风控工作如何开展&#xff1f; 不知道零售业务数字化风控工作如何开展&#xff1f; 课程特色…

zookeeper一文精通

目录 zookeeper是树形文件存储&#xff01; zookeeper集群是如何确保写入成功的&#xff1f; zookeeper集群为什么是CP&#xff1f; 选举leader也是半数同意 zookeeper集群是如何访问数据的&#xff1f; zookeeper是如何保证选举的从节点是拥有最新的数据的节点&#xff1…

( “树” 之 前中后序遍历) 145. 二叉树的后序遍历 ——【Leetcode每日一题】

基础概念&#xff1a;前中后序遍历 1/ \2 3/ \ \ 4 5 6层次遍历顺序&#xff1a;[1 2 3 4 5 6]前序遍历顺序&#xff1a;[1 2 4 5 3 6]中序遍历顺序&#xff1a;[4 2 5 1 3 6]后序遍历顺序&#xff1a;[4 5 2 6 3 1] 层次遍历使用 BFS 实现&#xff0c;利用的就是 BFS…

二维码图片生成工具C#winform源码

二维码图片生成工具C#winform源码 源码描述&#xff1a; 一、源码特点 采用winform进行开发,生成二维码并保存&#xff0c;欢迎下载 二、功能介绍 本源码是一个可以自动生成二维码图片的小模块&#xff0c;可以添加自己的logo图片&#xff0c;可以保存在自己想要保存的地方 …

LeetCode 1043. Partition Array for Maximum Sum【记忆化搜索,动态规划】中等

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…

HDFS集群部署成功但网页无法打开如何解决(显示配置通过浏览器访问hdfs的端口)

在学习黑马2023大数据教程过程中&#xff0c;首先依照视频完成了如下配置&#xff1a;【必须】 【黑马2023大数据实战教程】大数据集群环境准备过程记录&#xff08;3台虚拟机&#xff09; 黑马2023大数据实战教程】VMWare虚拟机部署HDFS集群详细过程 最后node1的hadoop用户下…

在win10系统中安装anaconda

1、 Anaconda的下载 你可以根据你的操作系统是32位还是64位选择对应的版本到官网下载&#xff0c;但是官网下载龟速。 建议到清华大学镜像站下载 &#xff1a;Index of /anaconda/archive/ | 清华大学开源软件镜像站 | Tsinghua Open Source MirrorIndex of /anaconda/archiv…

Prometheus/Metrics监控dubbo线程池状态

网上找了些文章&#xff0c;发现挺少的&#xff0c;下面一些文章有些帮助 https://cloud.tencent.com/developer/article/1800906 https://github.com/apache/dubbo/issues/6625 其中第二篇文有写到&#xff0c;通过dubbo的spi获取DataStore&#xff0c;然后再拿到dubbo的线程…