一, 遇到的问题
在. Core API 的编写中, 我们经常会对一些功能点进行新增编辑操作, 同时我们有时也会进行查询, 但是我们查询的表的数据与我们返回的数据相差甚大, 这是我们有需要自己手动进行类型的转换, 去输出我们需要的类型. 在添加和修改的时候我们也是需要传入 A 类型然后转换成我们需要的 B 类型去进行数据库的添加. 其中我们就会写许多的简单重复代码, 但是又不能不写. 那么我们如何去避免这种情况呢? 下面介绍的 AutoMapper 进行对象映射, 可以很方便快捷的帮助我们解决这个问题.
二, AutoMapper 介绍及安装配置
本次案例使用的是. Net Core 2.2 和 AutoMapper(8.0.0) 以及 AutoMapper.Extensions.Microsoft.DependencyInjection(6.0.0). 在我们安装 Nuget 包之后我们需要创建一个配置类来继承 AutoMapper 的 Profile 类, 这里我们暂且命名是 MapperConfig, 同时我们还需要在 Startup.cs 中注入 AutoMapper 和刚刚我们创建 MapperConfig 文件.
我们在使用 Mapper 的时候我们可以选择使用依赖注入到控制器中使用, 也可以直接 using 引用使用
到这里我们基础的配置就算好了, 那我们一起看下我们怎么去使用 AutoMapper 进行实体映射转换吧.
三, 详细使用介绍
1. 一对一的对应字段实体转换
我们看到上面就是我们需要转换的实体类和 Dto 了, 对于简单这种转换我们, 我们需要在 Mapper 配置文件中创建一个对应转换关系, 然后一行代码进行转换.
2. 一对一不对应字段转换
上面我们转换对象都是一对一的转换, 都有对应的转换关系. 那么我们在实体和 Dto 中有不对应的关系时我们该如何转换呢?
就如这样, 我们将实体类 User 转换 UserAppointModel 类, 我们该如何转换呢? 如果我们通过第一种转换方式的话, 我们会发现 Time 这个字段是空的, 这里我们就需要加额外的配置了, 保证 User 的 CreateTime 字段可以转换成 UserAppointModel 的 Time 字段.
这里我们使用的是 ForMember(), 它是对单个成员进行自定义配置的一个方法, 也就是说如果还有其他的不对应字段我们依然可以在后面进行自定义配置, 使其对应转换.
3. 多表对应一个 Dto 进行转换
我们除了遇到一对一简单转换和特殊字段转换外, 我们有时还会遇到多对一的实体转换, 例如我们有些时候在 API 返回的时候需要对主表和副表的数据进行整合返回成一个实体. 这种情况我们怎么返回呢? 现在我们看下面的这个案例:
我们需要把 User 实体和 UserInfo 实体转换成 UserInfoModel 进行输出. 逻辑还是这个逻辑, 我们需要先转换一个实体, 然后在前一个实体的基础上进行另外一个实体转换. 那么能不能连续 Map 两次呢? 想法是这个想法, 可惜在 AutoMapper 原有基础上不支持这种写法, 不过我们可以重写其方法达到这种效果.
这里我们可以先创建一个非泛型静态类 MapperTest, 然后我们在里面写下以下方法:
这就是我们重写方法了, 这样也就可以实现我们上面的想法了. 在第一次转换的基础上进行第二转换, 也就实现了多对一的转换了.
4. 集合对应转换
我们如何进行集合对集合的转换呢? 集合与集合之间的转换呢与之前的一对一转换类似, 只是我们转换的时候传的类型不是实体, 而是 List<> 集合而已. 下面看下 User 集合转换成 UserModel 集合的案例:
四, 写在后面
在平常的代码中, 我们经常会写一些重复的简单代码, 如创建, 修改输出实体转换. 都是 new 实体一个一个转换去写, 偶尔写那么一两个也还行, 写的多了就有点浪费时间和精力了. 本文介绍的是在. Net Core2.2 中使用 AutoMapper 进行实体映射转换的, 下一篇将介绍. Net Core3.0 AutoMapper9.0 的使用与. Net Core2.2 中的差别.
项目地址
用爱生活, 你会使自己幸福! 用爱工作, 你会使很多人幸福!
来源: https://www.cnblogs.com/hulizhong/p/12630972.html