基於 abp vNext 和 .NET Core 開發博客項目 - 用AutoMapper搞定對象映射

来源:https://www.cnblogs.com/meowv/archive/2020/05/28/12966092.html
-Advertisement-
Play Games

上一篇文章(https://www.cnblogs.com/meowv/p/12961014.html)集成了定時任務處理框架Hangfire,完成了一個簡單的定時任務處理解決方案。 本篇緊接著來玩一下AutoMapper,AutoMapper可以很方便的搞定我們對象到對象之間的映射關係處理,同時a ...


上一篇文章(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.csPostDto.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;
}

ObjectMapperApplicationService中已經被註入,我們的繼承了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;
}

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

0

可以看到,結果也是可以出來的,後續都將按照上面的方法大量用到對象映射。

順便介紹.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,搞定對象到對象間的映射,篇幅簡短,內容比較簡單,你學會了嗎?

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 使用場景:新頭像替換舊的頭像 步驟: 1. 讀取資料庫頭像的URL地址 2. 獲取URL地址的有效欄位 3. file文件路徑設置 4. 刪除圖片文件 Thinkphp 代碼如下: <?php public function delPic(){ //獲取用戶id $uid = input('uid' ...
  • Java這門語言的發展是很有意思的,它不像Python, Ruby 等完全是開源社區驅動,也不像C#,VB.NET主要由微軟操刀。它是一個以Oracle(之前是Sun)為主,各大巨頭一起參與,一起制定標準的一門語言。 想對Java添加一點特性, 得走JCP流程,巨頭們要審查,看看對自己是否有利,然後 ...
  • Blazor編譯後的文件是靜態文件,所以我們只需要一個支持靜態頁面的web server即可。 根據不同項目,會用不同的容器編排,本文已無網關的情況下為例,一步一步展示如何打包進docker 需求 HTTPS 既然無網關,直接面向互聯網,所以HTTPS顯得尤為重要 HTTP/2 TLS3.0 既然都 ...
  • C#編碼轉換主要使用了Encoding.Convert方法,它需要原編碼字元串的位元組數組作為參數,返回目標編碼的位元組數組。Encoding對象可以從字元串獲取位元組數組,又能夠從位元組數組還原字元串,因此可以將其組合用來轉碼。 ...
  • k8s 和 Docker容器技術,當前非常流行的技術. 讓人日狗的是, 這套技術棧對CN的donet 程式員不怎麼友好。娓娓道來,1. 好多鏡像都是需要梯子才能訪問; 2. window程式員天生對命令行操作陌生。3. 好多資料都是linux 等等..... 下麵我們來一起安裝部署下。 一, 安裝環 ...
  • 0. 前言 在前一篇中我們講到了Dapper的應用,但是給我們的感覺Dapper不像個ORM更像一個IDbConnection的擴展。是的,沒錯。在實際開發中我們經常用Dapper作為對EF Core的補充。當然了Dapper並不僅僅只有這些,就讓我們通過這一篇文章去讓Dapper更像一個ORM吧。 ...
  • (1):C#讀取DB文件 第一步 下載DLL文件並安裝 DLL下載地址https://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki 選用版本sqlite-netFx46-setup-bundle-x64-2015-1.0 ...
  • 幾種常見的加密方法的實現 1.ACSII碼加密 //ACSII碼加密 private static string ACSIIPWd(string rpwd) { string Ret; byte[] array = System.Text.Encoding.ASCII.GetBytes(rpwd); ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...