基于 abp vNext 和 .NET Core 开发博客项目 - 用AutoMapper搞定对象映射
上一篇文章(https://www.cnblogs.com/meowv/p/12961014.html)集成了定时任务处理框架Hangfire,完成了一个简单的定时任务处理解决方案。
本篇紧接着来玩一下AutoMapper,AutoMapper可以很方便的搞定我们对象到对象之间的映射关系处理,同时abp也帮我们是现实了IObjectMapper
接口,先根据官方文档:https://docs.abp.io/zh-Hans/abp/latest/Object-To-Object-Mapping ,将AutoMapper添加依赖到项目中。
在.Application
层模块类中添加AbpAutoMapperModule
模块依赖。
//MeowvBlogApplicationModule.cs
using Meowv.Blog.Application.Caching;
using Volo.Abp.AutoMapper;
using Volo.Abp.Identity;
using Volo.Abp.Modularity;
namespace Meowv.Blog.Application
{
[DependsOn(
typeof(AbpIdentityApplicationModule),
typeof(AbpAutoMapperModule),
typeof(MeowvBlogApplicationCachingModule)
)]
public class MeowvBlogApplicationModule : AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
...
}
}
}
在本项目中,主要处理的就是实体和DTO之前的映射关系,以之前写的BlogService.cs
中的增删改查为例,将Post.cs
和PostDto.cs
互相映射。
先看GetPostAsync(int id)
这个方法,之前的做法是手动创建对象,然后为其一个一个的赋值,可以想象当我们的字段超级多的时候,都得写一遍。现在有了AutoMapper,一句代码就可以搞定。
public async Task<ServiceResult<PostDto>> GetPostAsync(int id)
{
var result = new ServiceResult<PostDto>();
var post = await _postRepository.GetAsync(id);
if (post == null)
{
result.IsFailed("文章不存在");
return result;
}
//var dto = new PostDto
//{
// Title = post.Title,
// Author = post.Author,
// Url = post.Url,
// Html = post.Html,
// Markdown = post.Markdown,
// CategoryId = post.CategoryId,
// CreationTime = post.CreationTime
//};
var dto = ObjectMapper.Map<Post, PostDto>(post);
result.IsSuccess(dto);
return result;
}
ObjectMapper
在ApplicationService
中已经被注入,我们的继承了ServiceBase
,可以直接使用。
到这里还没完,其中最重要的一步就是定义类与类之间的映射关系,AutoMapper提供了多种定义类之间映射的方法,有关详细信息请参阅AutoMapper的文档:https://docs.automapper.org/
其中定义一种映射的方法是创建一个Profile 类,在.Application
层添加MeowvBlogAutoMapperProfile.cs
,直接继承Profile
在构造函数中定义即可。
//MeowvBlogAutoMapperProfile.cs
using AutoMapper;
using Meowv.Blog.Application.Contracts.Blog;
using Meowv.Blog.Domain.Blog;
namespace Meowv.Blog.Application
{
public class MeowvBlogAutoMapperProfile : Profile
{
public MeowvBlogAutoMapperProfile()
{
CreateMap<Post, PostDto>();
CreateMap<PostDto, Post>().ForMember(x => x.Id, opt => opt.Ignore());
}
}
}
定义两个规则,第一个:从Post
映射到PostDto
,因为PostDto
所有属性在Post
中都是存在的,所以直接CreateMap<>
即可;第二个:从PostDto
映射到Post
,因为Post
中存在Id属性,而在PostDto
中是没有的,所以可以使用ForMember(...)
来忽略掉Id属性。
定义好映射规则后,在模块类中添加使用。
//MeowvBlogApplicationModule.cs
...
public override void ConfigureServices(ServiceConfigurationContext context)
{
Configure<AbpAutoMapperOptions>(options =>
{
options.AddMaps<MeowvBlogApplicationModule>(validate: true);
options.AddProfile<MeowvBlogAutoMapperProfile>(validate: true);
});
}
...
使用同样的方式修改一下InsertPostAsync(PostDto dto)
方法的代码。
public async Task<ServiceResult<string>> InsertPostAsync(PostDto dto)
{
var result = new ServiceResult<string>();
//var entity = new Post
//{
// Title = dto.Title,
// Author = dto.Author,
// Url = dto.Url,
// Html = dto.Html,
// Markdown = dto.Markdown,
// CategoryId = dto.CategoryId,
// CreationTime = dto.CreationTime
//};
var entity = ObjectMapper.Map<PostDto, Post>(dto);
var post = await _postRepository.InsertAsync(entity);
if (post == null)
{
result.IsFailed("添加失败");
return result;
}
result.IsSuccess("添加成功");
return result;
}
解放了双手,代码也变少了,真香,去测试一下用了对象映射后的接口是否好使。
可以看到,结果也是可以出来的,后续都将按照上面的方法大量用到对象映射。
顺便介绍.HttpApi.Hosting
层几个配置属性。
路由规则配置,默认Swagger中的路由是大写的,如果我想转成小写可以使用以下配置代码,都写在模块类MeowvBlogHttpApiHostingModule.cs
中。
public override void ConfigureServices(ServiceConfigurationContext context)
{
...
context.Services.AddRouting(options =>
{
// 设置URL为小写
options.LowercaseUrls = true;
// 在生成的URL后面添加斜杠
options.AppendTrailingSlash = true;
});
...
}
使用HSTS的中间件,该中间件添加了严格传输安全头。
public override void OnApplicationInitialization(ApplicationInitializationContext context)
{
...
app.UseHsts();
...
}
直接使用默认的跨域配置。
public override void OnApplicationInitialization(ApplicationInitializationContext context)
{
...
app.UseCors();
...
}
HTTP请求转HTTPS。
public override void OnApplicationInitialization(ApplicationInitializationContext context)
{
...
app.UseHttpsRedirection();
...
}
转发将标头代理到当前请求,配合 Nginx 使用,获取用户真实IP。
public override void OnApplicationInitialization(ApplicationInitializationContext context)
{
...
pp.UseForwardedHeaders(new ForwardedHeadersOptions
{
ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto
});
...
}
本篇介绍了如何使用AutoMapper,搞定对象到对象间的映射,篇幅简短,内容比较简单,你学会了吗?
基于 abp vNext 和 .NET Core 开发博客项目 - 用AutoMapper搞定对象映射的更多相关文章
- 基于 abp vNext 和 .NET Core 开发博客项目 - 博客接口实战篇(一)
系列文章 基于 abp vNext 和 .NET Core 开发博客项目 - 使用 abp cli 搭建项目 基于 abp vNext 和 .NET Core 开发博客项目 - 给项目瘦身,让它跑起来 ...
- 基于 abp vNext 和 .NET Core 开发博客项目 - 博客接口实战篇(二)
系列文章 基于 abp vNext 和 .NET Core 开发博客项目 - 使用 abp cli 搭建项目 基于 abp vNext 和 .NET Core 开发博客项目 - 给项目瘦身,让它跑起来 ...
- 基于 abp vNext 和 .NET Core 开发博客项目 - 博客接口实战篇(三)
系列文章 基于 abp vNext 和 .NET Core 开发博客项目 - 使用 abp cli 搭建项目 基于 abp vNext 和 .NET Core 开发博客项目 - 给项目瘦身,让它跑起来 ...
- 基于 abp vNext 和 .NET Core 开发博客项目 - 博客接口实战篇(四)
系列文章 基于 abp vNext 和 .NET Core 开发博客项目 - 使用 abp cli 搭建项目 基于 abp vNext 和 .NET Core 开发博客项目 - 给项目瘦身,让它跑起来 ...
- 基于 abp vNext 和 .NET Core 开发博客项目 - 博客接口实战篇(五)
系列文章 基于 abp vNext 和 .NET Core 开发博客项目 - 使用 abp cli 搭建项目 基于 abp vNext 和 .NET Core 开发博客项目 - 给项目瘦身,让它跑起来 ...
- 基于 abp vNext 和 .NET Core 开发博客项目 - Blazor 实战系列(一)
系列文章 基于 abp vNext 和 .NET Core 开发博客项目 - 使用 abp cli 搭建项目 基于 abp vNext 和 .NET Core 开发博客项目 - 给项目瘦身,让它跑起来 ...
- 基于 abp vNext 和 .NET Core 开发博客项目 - Blazor 实战系列(二)
系列文章 基于 abp vNext 和 .NET Core 开发博客项目 - 使用 abp cli 搭建项目 基于 abp vNext 和 .NET Core 开发博客项目 - 给项目瘦身,让它跑起来 ...
- 基于 abp vNext 和 .NET Core 开发博客项目 - Blazor 实战系列(三)
系列文章 基于 abp vNext 和 .NET Core 开发博客项目 - 使用 abp cli 搭建项目 基于 abp vNext 和 .NET Core 开发博客项目 - 给项目瘦身,让它跑起来 ...
- 基于 abp vNext 和 .NET Core 开发博客项目 - Blazor 实战系列(四)
系列文章 基于 abp vNext 和 .NET Core 开发博客项目 - 使用 abp cli 搭建项目 基于 abp vNext 和 .NET Core 开发博客项目 - 给项目瘦身,让它跑起来 ...
随机推荐
- MYSQL 排序和分组
一.MYSQL 中有两种排序方式: 1:通过有序索引顺序扫描直接返回有序数据,这种方式在使用explain 分析查询的时候显示为Using Index ,不需要额外的排序,操作效率较高. 2: 是通过 ...
- 数制转换itoa atoi int转字符串 字符串转int string转int int转string
在苦于昨晚最后一个数制转换题,他的转换结果必须是整形数,纳尼?转换完放数组里又要变成整形数.这是什么操作,而且如果是16进制,用字母A,B-表示,在进行运算时都难以计算. 突发奇想,当十进制成立的时候 ...
- USACO Training Section 1.1 坏掉的项链Broken Necklace
题目描述 你有一条由N个红色的,白色的,或蓝色的珠子组成的项链(3<=N<=350),珠子是随意安排的. 这里是 n=29 的二个例子: 第一和第二个珠子在图片中已经被作记号. 图片 A ...
- 图论--最长路--洛谷P1807 最长路_NOI导刊2010提高(07)
题目描述 设G为有n个顶点的有向无环图,G中各顶点的编号为1到n,且当为G中的一条边时有i < j.设w(i,j)为边的长度,请设计算法,计算图G中<1,n>间的最长路径. 输入格式 ...
- 图论--2-SAT--POJ Ikki's Story IV - Panda's Trick
Description liympanda, one of Ikki's friend, likes playing games with Ikki. Today after minesweeping ...
- [bzoj5329] P4606 [SDOI2018]战略游戏
P4606 [SDOI2018]战略游戏:广义圆方树 其实会了圆方树就不难,达不到黑,最多算个紫 那个转换到圆方树上以后的处理方法,画画图就能看出来,所以做图论题一定要多画图,并把图画清楚点啊!! 但 ...
- 高精度封装Bignum
还没有写完,目前只实现了加,乘,且不能作用于负数 \(update\ in 20.4.8 添加了高精除低精ddiv函数,比较大小comp函数\) #include <bits/stdc++.h& ...
- H - Fire CodeForces - 864E 01背包
https://codeforces.com/problemset/problem/864/E 这个题目要把这个按照物品毁灭时间进行排序,如果时间短就要排在前面,这个是因为要保证之后的物品的拯救不会影 ...
- spring boot项目中无法访问resources文件夹问题
如图,浏览器默认访问static文件下的内容,无法访问templates文件下的html文件. 解决方法: 在application.properties文件中添加静态资源目录的配置即可.
- 标准IDOC同步采购订单
目录 1功能说明 4 2功能实现 4 2.1创建逻辑系统并分配集团(SALE) 4 2.2维护RFC目标(SM59) 5 2.3在发送端创建模型视图(BD64) 5 2. ...