Dotnet Core中使用AutoMapper
文档:https://automapper.readthedocs.io/en/latest/index.html
GitHub:https://github.com/AutoMapper/AutoMapper/blob/master/docs/index.rst
什么是AutoMapper?
AutoMapper是一个对象-对象映射器。对象-对象映射通过将一种类型的输入对象转换为另一种类型的输出对象来工作。使AutoMapper变得有趣的是,它提供了一些有趣的约定,以免去搞清楚如何将类型A映射为类型B。只要类型B遵循AutoMapper既定的约定,就需要几乎零配置来映射两个类型。
为什么要使用AutoMapper?
映射代码很无聊。测试映射代码更加无聊。AutoMapper提供了简单的类型配置以及简单的映射测试。真正的问题可能是“为什么使用对象-对象映射?”映射可以在应用程序中的许多地方发生,但主要发生在层之间的边界中,例如UI /域层或服务/域层之间。一层的关注点通常与另一层的关注点冲突,因此对象-对象映射导致分离的模型,其中每一层的关注点仅会影响该层中的类型。
AutoMapper的使用场景:
AutoMapper是对象到对象的映射工具。在完成映射规则之后,AutoMapper可以将源对象转换为目标对象。
一般情况下,表现层与应用层之间是通过DTO(数据传输对象Data Transfer Object)来进行交互的,数据传输对象是没有行为的POCO对象(简单CLR对象Plain Old CLR Object),他的目的是为了对领域对象进行数据封装,实现层与层之间的数据传递。为何不直接将领域对象进行数据传递?因为领域对象更注重领域,DTO更注重数据。由于“富领域模型”的特点,这样会直接将领域对象的行为暴露给表现层。
DTO本身不是业务对象,它是根据UI需求进行设计的。简单来说Model面向业务,我们是通过业务来定义Model的。而DTO是面向UI,通过UI的需求来定义的,通过DTO我们实现了表现层与Model层之间的解耦,表现层不引用Model。如果开发过程中我们的模型变了,而界面没变,我们只需改Model而不需要去改动表现层。
如何使用AutoMapper?
首先,您需要同时使用源类型和目标类型。目标类型的设计可能会受到其所在层的影响,但是只要成员名称与源类型的成员匹配,AutoMapper的效果最佳。如果您有一个名为“ FirstName”的源成员,它将自动映射到名称为“ FirstName”的目标成员。AutoMapper还支持Flattening。
将源映射到目标时,AutoMapper将忽略空引用异常。这是设计使然。如果您不喜欢这种方法,则可以根据需要将AutoMapper的方法与自定义值解析器结合使用。
如何在Dotnet Core中使用AutoMapper?
首先,要安装依赖包:

在Startup.cs中利用Dotnet Core自带的容器进行注入,因为我里面是示例代码,新建的示例Demo也没有去改名字,也都是在同一个命名空间下的,但是在实际项目中是不会出现这种问题的
//添加对AutoMapper的支持
services.AddAutoMapper(Assembly.Load("WebApplication1"), Assembly.Load("WebApplication1"));

即下图所示的关系:

源类型Model对象,与映射后的DTO类型:
public class UserInfo
{
public string UserName { get; set; } public string UserPwd { get; set; } public string GetCreateTime { get; set; } }
public class UserInfoDTO
{
public string UserName { get; set; } public string UserPwd { get; set; } public string Role { get; set; } public DateTime CreateTime { get; set; } public string TestTime { get; set; }
}
Profile的用法:
Profile提供了一个命名的映射类,所有继承自Profile类的子类都是一个映射集合。这里我们创建一个UserProfile继承Profile类。
CreateMap:创建映射规则。
BeforeMap:在映射之前执行的方法。
AfterMap:反之,映射之后执行的方法。
自动化扁平映射:AutoMapper会将类中的属性进行分割,或匹配"Get"开头的方法。
ForMember:指定映射字段。
public class UserProfile : Profile
{
//添加你的尸体映射关系
public UserProfile()
{
CreateMap<UserInfo, UserInfoDTO>()
.BeforeMap((source, dto) =>
{
//可以较为精确的控制输出数据格式
if (string.IsNullOrEmpty(source.GetCreateTime))
{
source.GetCreateTime = Convert.ToDateTime(source.GetCreateTime).ToString("yyyy-MM-dd");
}
})
//指定映射字段。将UserInfo.GetCreateTime映射到UserInfoDTO.TestTime
.ForMember(dto => dto.TestTime, opt => opt.MapFrom(info => info.GetCreateTime))
.ForMember(dto => dto.Role, opt => opt.Ignore())
.ForMember(dto => dto.CreateTime, opt => opt.Ignore()); CreateMap<StudentInfo, UserInfo>();
}
}
控制器注入IMapper:
private readonly IMapper _mapper; public HomeController(IMapper mapper)
{
_mapper = mapper;
}
单个对象转DTO:
//模拟数据
var user = new UserInfo()
{
UserName = "bingle",
UserPwd = ""
};
var userDto = _mapper.Map<UserInfoDTO>(user);
集合转Dto集合:
//模拟数据
var userList = new List<UserInfo>
{
new UserInfo
{
UserName="bingle_1",
UserPwd=""
},
new UserInfo
{
UserName="bingle_2",
UserPwd=""
},
new UserInfo
{
UserName="bingle_3",
UserPwd=""
},
new UserInfo
{
UserName="bingle_4",
UserPwd=""
},
new UserInfo
{
UserName="bingle_5",
UserPwd=""
},
new UserInfo
{
UserName="bingle_6",
UserPwd=""
}
};
//对象集合转Dto集合
var usersDtos = _mapper.Map<List<UserInfoDTO>>(userList);
AutoMapper功能很强大,在这边介绍的只是很少的功能,有兴趣的伙伴可以去AutoMapper官方文档深入学习。
如果有小伙伴觉得在使用AutoMapper都得在Controller的构造函数中进行注入一遍麻烦的话,AutoMapper也是支持这种映射方式如:Mapper.Map
实例方式:
//模拟数据
var user = new UserInfo()
{
UserName = "bingle",
UserPwd = ""
};
var config = new MapperConfiguration(cfg => cfg.CreateMap<UserInfo, UserInfoDTO>());
var mapper = config.CreateMapper(); var userDTO = mapper.Map<UserInfoDTO>(user);
参考:https://blog.csdn.net/weixin_37207795/article/details/81009878
Dotnet Core中使用AutoMapper的更多相关文章
- ASP.NET CORE 中使用AutoMapper进行对象映射
ASP.NET CORE 中使用AutoMapper进行对象映射 1.什么是AutoMapper? AutoMapper是基于对象到对象约定的映射工具,常用于(但并不仅限制于)把复杂的对象模型转为DT ...
- ASP.NET.Core中使用AutoMapper
首先需要在NuGet中引用AutoMapper的类库 install-package AutoMapper install-package AutoMapper.Extensions.Micros ...
- .NET CORE 中使用AutoMapper进行对象映射
简介 AutoMapper uses a fluent configuration API to define an object-object mapping strategy. AutoMappe ...
- 依赖注入在 dotnet core 中实现与使用:1 基本概念
关于 Microsoft Extension: DependencyInjection 的介绍已经很多,但是多数偏重于实现原理和一些特定的实现场景.作为 dotnet core 的核心基石,这里准备全 ...
- ASP.NET Core Web 应用程序系列(五)- 在ASP.NET Core中使用AutoMapper进行实体映射
本章主要简单介绍下在ASP.NET Core中如何使用AutoMapper进行实体映射.在正式进入主题之前我们来看下几个概念: 1.数据库持久化对象PO(Persistent Object):顾名思义 ...
- DotNet Core中使用RabbitMQ
上一篇随笔记录到RabbitMQ的安装,安装完成,我们就开始使用吧. RabbitMQ简介 AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协 ...
- DotNet Core中使用dapper
我们都知道,ORM全称是,Object Relationship Mapper,即,对象关系映射.也就是可以用object来map我们的db,而且市面上的orm框架有很多,其中有一个框架叫做dappe ...
- 依赖注入在 dotnet core 中实现与使用:4. 集成 Autofac
本示例使用 .net core 5 rc-1 实现. 1. 添加 Nuget 包引用 使用 Autofac 当然要添加 Autofac 的 Nuget 包,主要涉及到两个: Autofac.Exten ...
- .NET Core中使用AutoMapper
何为AutoMapper AutoMapper是对象到对象的映射工具.在完成映射规则之后,AutoMapper可以将源对象转换为目标对象. 安装AutoMapper 这里我们在NuGet中下载安装Au ...
随机推荐
- 程序员修神之路--打通Docker镜像发布容器运行流程
菜菜哥,我看了一下docker相关的内容,但是还是有点迷糊 还有哪不明白呢? 如果我想用docker实现所谓的云原生,我的项目该怎么发布呢? 这还是要详细介绍一下docker了 Docker 是一个开 ...
- 社交媒体登录Spring Social的源码解析
在上一篇文章中我们给大家介绍了OAuth2授权标准,并且着重介绍了OAuth2的授权码认证模式.目前绝大多数的社交媒体平台,都是通过OAuth2授权码认证模式对外开放接口(登录认证及用户信息接口等). ...
- 机器学习算法在用户行为检测(UBA)领域的应用
[摘要]最近看到越来越多的安全圈的同学开始关注UBA或者UEBA的相关产品和技术,恰好这一段时也一直在跟进UBA产品的状况,正如Gartner报告所述,最具创新能力的UBA供应商往往都是一些初创公司, ...
- hibernate查询方式(四)
---恢复内容开始--- 1.mysql中的多表联合查询 ****/*内连接查询*/ 只显示两个表有关联的记录 //第一种 SELECT * FROM Class c ,Student s WHER ...
- Docker系列之MySQL安装教程
Docker系列之MySQL安装教程 有了前面的基础教程Docker系列之常用命令操作手册之后,本博客记录一篇mysql的安装教程 mysql镜像查询命令 docker search mysql 几个 ...
- python2和python3编码问题
欢迎加入python学习交流群 667279387 一.什么是编解码 1.什么是unicode 2.编码方式 二.python中的编解码 1.python2 (1).encode() 和 .decod ...
- mybatis 和servlet使用MVC实现用户登录,注册,退出
普通实现: USerMapper.java: package com.bjsxt.mapper; import org.apache.ibatis.annotations.Param; import ...
- [TimLinux] Python学习内容框架
以下内容主体来自<Python学习手册第四版>,大致整理出的方向 1. 第一部分:使用入门 介绍Python语法之前,先对Python的的各个方面进行一个比较宽广的介绍,包含对Python ...
- nitacm20317 来自张司机的挑战书
题目:让你求从x到y中(1<=x<=y<=10^18),二进制一的个数最多的数是哪个,如果有多个相同的答案,输出最小的. 题目链接:https://www.nitacm.com/pr ...
- HDU1561 The more ,The better (树形背包Dp)
ACboy很喜欢玩一种战略游戏,在一个地图上,有N座城堡,每座城堡都有一定的宝物,在每次游戏中ACboy允许攻克M个城堡并获得里面的宝物.但由于地理位置原因,有些城堡不能直接攻克,要攻克这些城堡必须先 ...