.net core 3.1 WebAPi 使用 AutoMapper 9.0、10.0
AutoMapper 可以很方便完成数据对象之间的转换。
Dto -> Entity
Entity -> ViewModel
Step 1:通过 NuGet 安装 AutoMapper 的包。


<Project Sdk="Microsoft.NET.Sdk.Web"> <PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
</PropertyGroup> <ItemGroup>
<PackageReference Include="AutoMapper" Version="9.0.0" />
<PackageReference Include="AutoMapper.Extensions.Microsoft.DependencyInjection" Version="7.0.0" />
</ItemGroup> </Project>
Project.csproj
准备两个类 User 和 Department

public class User
{
public int Id { get; set; } public string Name { get; set; } public int Age { get; set; } public string Remark { get; set; } public int DepartmentId { get; set; } public Department DepartmentInfo { get; set; }
}
User

public class Department
{
public int Id { get; set; } public string Name { get; set; } public string Remark { get; set; }
}
Department
创建 User 的 Dto 和 ViewModel

public class UserDto
{
public int Id { get; set; } public string Name { get; set; }
}
UserDto

public class UserViewModel
{
public int Id { get; set; } public string Name { get; set; } public int Age { get; set; } public string Remark { get; set; } public int DepartmentId { get; set; } public string DepartmentName { get; set; }
}
UserViewModel
Step 2:配置好对象之间的转换。
创建类 UserMapper 继承抽象类 Profile

public class UserMapper : Profile
{
public UserMapper()
{
CreateMap<UserDto, User>();
CreateMap<User, UserViewModel>()
.BeforeMap((u, v) => u.Remark = "Good")
.ForMember(v => v.DepartmentId, u => u.MapFrom(user => user.DepartmentId))
.ForMember(v => v.DepartmentName, u => u.MapFrom(user => user.DepartmentInfo.Name))
.AfterMap((u, v) => u.Age++);
}
}
UserMapper
Profile 里面实现了两个接口

Step 3:注册服务
在 Startup.cs 的 ConfigureServices 方法中注册。

public void ConfigureServices(IServiceCollection services)
{
// ...
services.AddAutoMapper(typeof(UserMapper));
// ...
}
ConfigureServices
Step 4:使用
创建 api 控制器
声明 private readonly IMapper _mapper;

[Route("api/[controller]/[action]")]
[ApiController]
public class UserController : ControllerBase
{
private readonly IMapper _mapper;
public UserController(IMapper mapper)
{
_mapper = mapper;
}
[ActionName("dto")]
[HttpGet]
public IActionResult DtoToEntity()
{
var userDto = new UserDto() { Id = 1, Name = "Bill" };
var userEntity = _mapper.Map<UserDto, User>(userDto);
JsonResult result = new JsonResult(userEntity);
return result;
}
[ActionName("vo")]
[HttpGet]
public IActionResult EntityToViewModel()
{
var department = new Department() { Id = 101, Name = "Market" };
var user = new User() { Id = 1, Name = "Bill", Age = 25, DepartmentId = 101, DepartmentInfo = department };
var viewModel = _mapper.Map<User, UserViewModel>(user);
JsonResult result = new JsonResult(viewModel);
return result;
}
}
UserController
结果:
Dto -> Entity

Entity -> ViewModel

Step 5:自动化注册
如果每添加一个 Mapper 都需要修改 StartUp 类来完成注册,不是什么好方式。
自动化注册才是更好的(主要还是方便摸鱼)。
为了实现自动化注册,需要找到项目中的所有 Mapper 对象,要给 Mapper 打上一个标记。
添加接口类 IProfile

public interface IProfile
{ }
IProfile
在所有的 Mapper 类里面,实现这个接口。

public class UserMapper : Profile, IProfile
{
public UserMapper()
{
CreateMap<UserDto, User>();
CreateMap<User, UserViewModel>()
.BeforeMap((u, v) => u.Remark = "Good")
.ForMember(v => v.DepartmentId, u => u.MapFrom(user => user.DepartmentId))
.ForMember(v => v.DepartmentName, u => u.MapFrom(user => user.DepartmentInfo.Name))
.AfterMap((u, v) => u.Age++);
}
}
UserMapper
再通过查找所有实现了 IProfile 接口的类,就可以找到所有的 Mapper 对象。
( Profile 是 AutoMapper 组件里的接口,必须自定义项目中的唯一标记。)
创建 MapperRegister 类,实现获取所有的 Mapper 对象。

public class MapperRegister
{
/// <summary>
/// 通过反射自动化注册
/// </summary>
/// <returns></returns>
public static Type[] MapType()
{ Assembly ass = Assembly.GetAssembly(typeof(IProfile));
Type[] types = ass.GetTypes(); List<Type> allList = new List<Type>(); foreach (Type item in types)
{
if (item.IsInterface) continue;//判断是否是接口
Type[] ins = item.GetInterfaces();
foreach (Type ty in ins)
{
if (ty == typeof(IProfile))
{
allList.Add(item);
}
}
} Type[] alltypes = allList.ToArray();
return alltypes;
} }
MapperRegister
修改 StrartUp 类,调整注册方式。

public void ConfigureServices(IServiceCollection services)
{
services.AddControllers(); //services.AddAutoMapper(typeof(UserMapper));
//自动化注册
services.AddAutoMapper(MapperRegister.MapType()); }
Startup
这样就可以每次添加 Mapper 类的时候,只需要添加 IProfile 标记,就可以自动注册了。
自动化注册方式二:
在很多常见的项目中,同一个项目的Mapper文件都是放在同一个文件夹内。命名都以 Mapper 结尾。
然后在 Startup.cs 里面
services.AddAutoMapper(
Assembly.Load("Leaf.Application").GetTypes()
.Where(t => t.FullName.EndsWith("Mapper"))
.ToArray()
);
.net core 3.1 WebAPi 使用 AutoMapper 9.0、10.0的更多相关文章
- 分享一个简单程序(webApi+castle+Automapper+Ef+angular)
前段时间在周末给朋友做了一个小程序,用来记录他们单位的一些调度信息(免费,无版权问题).把代码分享出来.整个程序没有做任何架构.但是麻雀虽小,用到的技术也没少.WebApi+Castle+AutoMa ...
- asp.net core系列 38 WebAPI 返回类型与响应格式--必备
一.返回类型 ASP.NET Core 提供以下 Web API Action方法返回类型选项,以及说明每种返回类型的最佳适用情况: (1) 固定类型 (2) IActionResult (3) Ac ...
- ASP.NET Core 2.2 WebApi 系列【九】使用SignalR (作者:tenghao510 ) 学习及内容补充
原文地址: ASP.NET Core 2.2 WebApi 系列[九]使用SignalR 今天,看到了大牛的这篇博文, 发了一下评论, 我很惊喜, 没想到他很快就回复了我, 而且通过QQ帮助了S ...
- 【Docker】 .Net Core 3.1 webapi 集成EF Code First,使用MySql进行业务操作 、配置swagger (三)
系列目录: [Docker] CentOS7 安装 Docker 及其使用方法 ( 一 ) [Docker] 使用Docker 在阿里云 Centos7 部署 MySQL 和 Redis (二) [D ...
- [转]Could not load file or assembly 'System.Core, Version=2.0.5.0 和autofac冲突的问题
Could not load file or assembly 'System.Core, Version=2.0.5.0 和autofac冲突的问题 来源:http://www.cnblogs.co ...
- Could not load file or assembly 'System.Core, Version=2.0.5.0 和autofac冲突的问题
在部署到iis的时候会出现这个状况. 解决:下载安装这个补丁 http://support.microsoft.com/kb/2468871 http://www.microsoft.com/zh-c ...
- 使用Autofac部署IIS6.0时未能加载文件或程序集“System.Core, Version=2.0.5.0...“
错误信息 .net4.0项目中使用autofac这个IOC容器,在部署在win2003+iis6时出现以下错误. “/”应用程序中的服务器错误. --------------------------- ...
- NET Core 拓展方法和中间件集合(支持NET Core2.0+)
# Pure.NETCoreExtentensions https://github.com/purestackorg/Pure.NETCoreExtensions NET Core 拓展方法和中间件 ...
- System.Core, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e, Retargetable=Yes”
“System.Core, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e, Retargetable=Yes” 或 ...
随机推荐
- Netty 组件分析
EventLoop 事件循环对象 EventLoop 本质是一个单线程执行器(同时维护了一个 Selector),里面有 run 方法处理 Channel 上源源不断的 io 事件. 它的继承关系比较 ...
- 激活NX窗口的按钮
原理:取得按钮名称以后,通过运行宏文件激活按钮 Imports System.IO Imports System.Runtime.InteropServices Imports NXOpen.Menu ...
- css3鼠标悬停图片边框线条动画特效
css3鼠标经过内容区时,边框线条特效效果制作. html: <div class="strength grWidth hidden"> <div class ...
- 2 What is the Domain Driven Design? 什么是领域驱动设计
What is the Domain Driven Design? 什么是领域驱动设计 Domain-driven design (DDD) is an approach to software de ...
- js--Symbol 符号基本数据类型
前言 ECMAScript 6 中新增了 Symbol 符号这一基本数据类型,那么Symbol 是用来干什么的,对开发又有什么帮助呢?本文来总结记录一下 Symbol 的相关知识点. 正文 Symbo ...
- BUAA SE 个人项目作业
项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 个人项目作业 我在这个课程的目标是 通过个人项目实践熟悉个人开发流程 一.在文章开头给出教学班级和 ...
- 2021.10.12考试总结[NOIP模拟75]
T1 如何优雅的送分 考虑式子的实际意义.\(2^{f_n}\)实际上就是枚举\(n\)质因子的子集.令\(k\)为这个子集中数的乘积,就可以将式子转化为枚举\(k\),计算\(k\)的贡献. 不难得 ...
- 【Azure 应用服务】App Service For Linux 部署Java Spring Boot应用后,查看日志文件时的疑惑
编写Java Spring Boot应用,通过配置logging.path路径把日志输出在指定的文件夹中. 第一步:通过VS Code创建一个空的Spring Boot项目 第二步:在applicat ...
- 访问所有HTTPS网站显示连接不安全 (火狐浏览器)
当 Firefox 连接到一个安全的网站时(网址最开始为"https://"),它必须确认该网站出具的证书有效且使用足够高的加密强度.如果证书无法通过验证,或加密强度过低,Fire ...
- PHP笔记1__基础知识
客户端: 美妙的网页组成(都是由浏览器解释): 1.HTML 2.CSS--给HTML化妆 3.客户端脚本编程语言(JavaScript等)--特效 服务器端: 1.Web服务器Apache/Ngi ...