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 ...
随机推荐
- java多线程与线程池
1. 场景描述 以前多线程也常用,这次因需再页面上用到多线程,如下图,总结下,有需要的朋友可以参考下. 2. 解决方案 2.1 线程池概念 线程池官方定义不说了,通俗说下:池子的概念,事先(预定义)创 ...
- 关于Python中的错误与异常,你是否了解的够仔细?
每次版本结束都描述这着同样的错误,相似的问题,但始终没见解决.所以今天,我就来总结下Python的错误与异常! 异常与错误 错误 语法错误 可以通过IDE或者解释器给出提示的错误 opentxt('a ...
- MVVMLight绑定数据
我们先新建一个WPF项目MVVMLightDemo,添加GalaSoft.MvvmLight.dll(没有可以自己下载) 然后在项目中添加三个文件夹,如图: 先添加我们的Model,在Model下新建 ...
- luogu P1901 发射站
题目描述 某地有 N 个能量发射站排成一行,每个发射站 i 都有不相同的高度 Hi,并能向两边(当 然两端的只能向一边)同时发射能量值为 Vi 的能量,并且发出的能量只被两边最近的且比 它高的发射站接 ...
- mininet(二)简单的路由实验
mininet(一)实验环境搭建 mininet(二)简单的路由实验 mininet(三)简单的NAT实验 在网上找了 好几个代码都是不能直接复现成功,这里把自己实现成功的代码给大家演示一下. 实验的 ...
- TypeScript - 泛型
什么是泛型 官方是这样介绍的: 软件工程中,我们不仅要创建一致的定义良好的API,同时也要考虑可重用性. 组件不仅能够支持当前的数据类型,同时也能支持未来的数据类型,这在创建大型系统时为你提供了十分灵 ...
- Koa - 使用koa-multer上传文件(上传限制、错误处理)
前言 上传文件在开发中是很常见的操作,今天我选择使用koa-multer中间件来实现这一功能,除了上传文件外,我还会对文件上传进行限制,以及发生上传错误时的处理. 由于原来的 koa-multer 已 ...
- Mac 配置 PlantUML
PlantUML简介 UML: Unified Modeling Language 统一建模语言,是非专利的第三代建模和规约语言.UML是一种开放的方法,用于说明.可视化.构建和编写一个正在开发的.面 ...
- 统计学习方法与Python实现(二)——k近邻法
统计学习方法与Python实现(二)——k近邻法 iwehdio的博客园:https://www.cnblogs.com/iwehdio/ 1.定义 k近邻法假设给定一个训练数据集,其中的实例类别已定 ...
- iSensor APP 之 摄像头调试 OV5642 续集2
参考上一篇博客 作为续集,主要测试 RAW格式下的 不同分辨率效果 iSensor APP 之 摄像头调试 OV5642 直接上图吧 720p 拍照效果