日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

基于 abp vNext 和 .NET Core 开发博客项目 - 用AutoMapper搞定对象映射

發(fā)布時間:2025/1/21 asp.net 79 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于 abp vNext 和 .NET Core 开发博客项目 - 用AutoMapper搞定对象映射 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

基于 abp vNext 和 .NET Core 開發(fā)博客項目 - 用AutoMapper搞定對象映射
轉(zhuǎn)載于:https://github.com/Meowv/Blog

本篇緊接著來玩一下AutoMapper,AutoMapper可以很方便的搞定我們對象到對象之間的映射關(guān)系處理,同時abp也幫我們是現(xiàn)實了IObjectMapper接口,先根據(jù)官方文檔: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之前的映射關(guān)系,以之前寫的BlogService.cs中的增刪改查為例,將Post.cs和PostDto.cs互相映射。

先看GetPostAsync(int id)這個方法,之前的做法是手動創(chuàng)建對象,然后為其一個一個的賦值,可以想象當(dāng)我們的字段超級多的時候,都得寫一遍。現(xiàn)在有了AutoMapper,一句代碼就可以搞定。

public async Task<ServiceResult> GetPostAsync(int id)
{
var result = new ServiceResult();

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中已經(jīng)被注入,我們的繼承了ServiceBase,可以直接使用。

到這里還沒完,其中最重要的一步就是定義類與類之間的映射關(guān)系,AutoMapper提供了多種定義類之間映射的方法,有關(guān)詳細(xì)信息請參閱AutoMapper的文檔:https://docs.automapper.org/

其中定義一種映射的方法是創(chuàng)建一個Profile 類,在.Application層添加MeowvBlogAutoMapperProfile.cs,直接繼承Profile在構(gòu)造函數(shù)中定義即可。

//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());} }

}
定義兩個規(guī)則,第一個:從Post映射到PostDto,因為PostDto所有屬性在Post中都是存在的,所以直接CreateMap<>即可;第二個:從PostDto映射到Post,因為Post中存在Id屬性,而在PostDto中是沒有的,所以可以使用ForMember(…)來忽略掉Id屬性。

定義好映射規(guī)則后,在模塊類中添加使用。

//MeowvBlogApplicationModule.cs

public override void ConfigureServices(ServiceConfigurationContext context)
{
Configure(options =>
{
options.AddMaps(validate: true);
options.AddProfile(validate: true);
});
}

使用同樣的方式修改一下InsertPostAsync(PostDto dto)方法的代碼。

public async Task<ServiceResult> InsertPostAsync(PostDto dto)
{
var result = new ServiceResult();

//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;

}
解放了雙手,代碼也變少了,真香,去測試一下用了對象映射后的接口是否好使。

圖片

可以看到,結(jié)果也是可以出來的,后續(xù)都將按照上面的方法大量用到對象映射。

順便介紹.HttpApi.Hosting層幾個配置屬性。

路由規(guī)則配置,默認(rèn)Swagger中的路由是大寫的,如果我想轉(zhuǎn)成小寫可以使用以下配置代碼,都寫在模塊類MeowvBlogHttpApiHostingModule.cs中。

public override void ConfigureServices(ServiceConfigurationContext context)
{

context.Services.AddRouting(options =>
{
// 設(shè)置URL為小寫
options.LowercaseUrls = true;
// 在生成的URL后面添加斜杠
options.AppendTrailingSlash = true;
});

}

使用HSTS的中間件,該中間件添加了嚴(yán)格傳輸安全頭。

public override void OnApplicationInitialization(ApplicationInitializationContext context)
{

app.UseHsts();

}

直接使用默認(rèn)的跨域配置。

public override void OnApplicationInitialization(ApplicationInitializationContext context)
{

app.UseCors();

}

HTTP請求轉(zhuǎn)HTTPS。

public override void OnApplicationInitialization(ApplicationInitializationContext context)
{

app.UseHttpsRedirection();

}

轉(zhuǎn)發(fā)將標(biāo)頭代理到當(dāng)前請求,配合 Nginx 使用,獲取用戶真實IP。

public override void OnApplicationInitialization(ApplicationInitializationContext context)
{

pp.UseForwardedHeaders(new ForwardedHeadersOptions
{
ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto
});

}

本篇介紹了如何使用AutoMapper,搞定對象到對象間的映射,篇幅簡短,內(nèi)容比較簡單,你學(xué)會了嗎?😁😁😁

開源地址:https://github.com/Meowv/Blog/tree/blog_tutorial

總結(jié)

以上是生活随笔為你收集整理的基于 abp vNext 和 .NET Core 开发博客项目 - 用AutoMapper搞定对象映射的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。