出于安全考虑,在后台与前台进行数据传输时,往往不会直接传输实体模型,而是使用Dto(Data transfer object 数据传输对象),这样在后台往前台传递数据时可以省略不必要的信息,只保留必要的信息,大大增强数据安全性。

下面给出两个相互对应的关系模型User、UserDto

public class User
{private const int NameMaxLength = 20;private const int PassWordMaxLength = 16;[Key]public long Id { get; }[MaxLength(NameMaxLength)]public string Name { get; set; }[MaxLength(PassWordMaxLength)][DataType(DataType.Password)]public string PassWord { get; set; }
}
public class UserDto
{private const int NameMaxLength = 20;private const int PassWordMaxLength = 16;[MaxLength(NameMaxLength)]public string Name { get; set; }[MaxLength(PassWordMaxLength)]public string PassWord { get; set; }
}

这里将 Id 定义为自增长主键,在注册页面,这个 Id 应不可见,这个时候使用Dto的好处就体现出来了,这个时候,在存入数据库时会涉及到 UserDto 往 User 的类型转换,按照之前的经验,肯定可以按照下面这样来写:

user.Name=userDto.Name;
user.PassWord=UserDto.PassWord;

这样的转换固然可以,但是如果一个 User 对象足够复杂,有十几个甚至二十几个属性,这个时候这种写法就会显得十分笨拙。

这个时候我们就可以借助AutoMapper来帮助我们完成 UserDto 到 User 的转换了。

首先安装Nuget包

在 Tools - Nuget Package Manage - Package Manage Console 输入

Install-Package AutoMapper 

安装相应的Nuget包。

根据 Github 上给出的帮助文档来看,有两种方法可以创建映射,一种是静态的 Initalize 一种是动态创建。

下面使用两种不同的方法来进行单元测试

public void Using_Initlalize_Test(){UserDto dto = new UserDto{Name = "Niko",PassWord = "1234",};Mapper.Initialize(ctx => ctx.CreateMap<UserDto, User>());User user = Mapper.Map<UserDto, User>(dto);user.Name.ShouldBe("Niko");user.PassWord.ShouldBe("1234");user.Id.ToString().ShouldBe("0");}public void Using_MapperConfiguration_Test(){var config = new MapperConfiguration(ctx => ctx.CreateMap<UserDto, User>());var mapper = config.CreateMapper();// var mapper = new Mapper(config);UserDto dto = new UserDto{Name = "Niko",PassWord = "1234",};User user = mapper.Map<User>(dto);//User user = Mapper.Map<User>(dto);user.Name.ShouldBe("Niko");user.PassWord.ShouldBe("1234");user.Id.ToString().ShouldBe("0");}

这里使用到 Shouldly 断言框架,具体用法参考官方文档。

写完规则之后 通常会调用 AssertConfigurationIsValid 方法,检查规则是否完整

  Mapper.AssertConfigurationIsValid();

两种方法,单元测试均通过。这样的话,借助 Automapper 处理复杂的对象映射,将大大简化我们的代码量。

为了更加便捷地使用 AutoMappper ,对AutoMapper进行扩展

public static class AutoMapperExtension
{/// <summary>/// 对象到对象/// </summary>/// <typeparam name="T"></typeparam>/// <param name="obj"></param>/// <returns></returns>public static T MapTo<T>(this object obj){if (obj == null) return default(T);Mapper.Initialize(ctx=>ctx.CreateMap(obj.GetType(),typeof(T)));return Mapper.Map<T>(obj);}/// <summary>/// 集合到集合/// </summary>/// <typeparam name="T"></typeparam>/// <param name="obj"></param>/// <returns></returns>public static List<T> MapTo<T>(this IEnumerable obj ){if (obj == null) throw new ArgumentNullException();Mapper.Initialize(ctx => ctx.CreateMap ( obj.GetType(), typeof(T))) ;return Mapper.Map<List<T>>(obj);}
}

使用上面的方法进行单元测试:

 public void testme(){UserDto dto = new UserDto{Name = "Niko",PassWord = "1234",};User user=dto.MapTo<User>();user.Name.ShouldBe("Niko");user.PassWord.ShouldBe("1234");user.Id.ToString().ShouldBe("0");}

转载于:https://www.cnblogs.com/llhhll/p/7810153.html

OOM框架AutoMapper基本使用(2)相关推荐

  1. 可能是.NET领域性能最好的对象映射框架——Mapster

    我之前文章提到过 MediatR 的作者 Jimmy Bogard,他也是大名鼎鼎的对象映射框架 AutoMapper 的作者.AutoMapper 的功能强大,在 .NET 领域的开发者中有非常高的 ...

  2. 使用Spring Boot搭建你的第一个应用程序

    文章目录 依赖配置 main程序配置 MVC配置 安全配置 存储 Web 页面和Controller 异常处理 测试 结论 Spring Boot是Spring平台的约定式的应用框架,使用Spring ...

  3. 如何在 ASP.NET Core 中写出更干净的 Controller

    你可以遵循一些最佳实践来写出更干净的 Controller,一般我们称这种方法写出来的 Controller 为瘦Controller,瘦 Controller 的好处在于拥有更少的代码,更加单一的职 ...

  4. python语言设计二级教程答案2019_全国计算机等级考试二级教程2019年版——Python语言程序设计参考答案...

    第二章 Python语言基本语法元素 一.选择题 C B B C A D B A D B 二.编程题 1.获得用户输入的一个整数N,计算并输出N的32次方. 在这里插入图片描述 2.获得用户输入的一段 ...

  5. 【Mybatis源码】源码分析

    [Mybatis源码]源码分析 (一)Mybatis重要组件 [1]四大核心组件 (1)SqlSessionFactoryBuilder (2)SqlSessionFactory (3)SqlSess ...

  6. $.ajax的async参数,jquery的$.ajax async使用详解

    async在jquery ajax中是一个同步参数了,我们下面来给大家介绍在jquery ajax中使用async时碰到的一些问题与方法介绍,希望例子能给各位同学带来一些帮助哦. async默认是tr ...

  7. 阿里企业金融阿里云实习一面复盘

    我算法好慌 企业金融(55min)是昨天晚上录音没录上我去,伤心.除了项目我MQ的防止消息重新消费没回答的多好,其他的基本都回答上来了.凭着记忆说一下把,不是太全,项目问了大概有20-30分钟 阿里云 ...

  8. AutoMapper在ABP框架中的使用说明

    为了说明AutoMapper如何使用,我专门开设了一个专题来讲,如果您还没有查看该专题,请点击这里.既然系统地学习了AutoMapper,那么接下来就是该用它实战的时候了.今天,我们就来揭开AutoM ...

  9. java写入excel文件内存不足,java 导出 excel 最佳实践,java 大文件 excel 避免OOM(内存溢出) excel 工具框架...

    产品需求 产品经理需要导出一个页面的所有的信息到 EXCEL 文件. 需求分析 对于 excel 导出,是一个很常见的需求. 最常见的解决方案就是使用 poi 直接同步导出一个 excel 文件. 客 ...

  10. 在 ASP.NET Core 项目中使用 AutoMapper 进行实体映射

    一.前言 在实际项目开发过程中,我们使用到的各种 ORM 组件都可以很便捷的将我们获取到的数据绑定到对应的 List<T> 集合中,因为我们最终想要在页面上展示的数据与数据库实体类之间可能 ...

最新文章

  1. 开源的视频笔记合集: 陌溪 / LearningNotes
  2. Java Word break analysis
  3. Burst Balloons
  4. 一个简单企业信息网站架构
  5. 行程匹配的算法python_节约里程算法的python实现
  6. 新型脑刺激疗法治疗重度抑郁症
  7. 计算机网络故障是指啥,网络故障管理
  8. oracle_java.exe,系统找不到C:\ProgramData\Oracle\Java\javapath\java.exe问题及解决方案
  9. 面试官的一些问题,给予小伙伴们一些帮助。
  10. Revit二次开发之绘制钢筋
  11. 云客服让每一个企业客户都成为座上宾
  12. 人工智能与数据挖掘的关系
  13. C语言结构体实现简单通讯录管理系统
  14. vs2019开发android应用,VS 2019开发APP(一)界面和代码
  15. 对数线性模型(Log-Linear Model)一种判别式模型的创建框架
  16. 2022年轨道交通行业研究报告
  17. Android列表ListView控件的使用
  18. 山西最新道路运输安全员模拟真题集及答案解析
  19. 【案例】郑州商品交易所:搭建AI预测模型,提升智能决策水平
  20. uniapp小程序更改swiper指示点样式

热门文章

  1. 多线程之线程通信条件Condition
  2. html2canvas关于图片不能正常截取 1
  3. TCP/IP-链路层
  4. 1.Java集合-HashMap实现原理及源码分析
  5. Oracle回收站使用全攻略
  6. 记录自己的心路文字~
  7. 一个有趣的Java编译问题
  8. [环境搭建]-IIS下搭建FTP过程 解决无法连接及534 Policy requires SSL错误
  9. Android Studio 工程项目的结构
  10. Luogu1880 石子合并