ASP.NET Core教程:ASP.NET Core使用AutoMapper

2021-02-19 新閣Net社群

一、前言

在實際的項目開發過程中,我們使用各種ORM框架可以使我們快捷的獲取到數據,並且可以將獲取到的數據綁定到對應的List<T>中,然後頁面或者接口直接顯示List<T>中的數據。但是我們最終想要顯示在視圖或者接口中的數據和資料庫實體之間可能存在著差異,一般的做法就是去創建一些對應的「模型」類,然後對獲取到的數據再次進行處理,從而滿足需求。

因此,如果便捷的實現資料庫持久化對象與模型對象之間的實體映射,避免在去代碼中手工實現這一過程,就可以大大降低開發的工作量。AutoMapper就是可以幫助我們實現實體轉換過程的工具。

二、使用AutoMapper實現實體映射

AutoMapper是一個OOM(Object-Object-Mapping)組件,從它的英文名字中可以看出,AutoMapper主要是為了實現實體間的相互轉換,從而避免我們每次採用手工的方式進行轉換。在沒有OOM這類組件之前,如果我們需要實現實體之間的轉換,只能使用手工修改代碼,然後逐個賦值的方式實現映射,而有了OOM組件,可以很方便的幫助我們實現這一需求。看下面的一個例子。

首先創建一個ASP.NET Core WebApi項目:

添加一個Student實體類:

添加StudentDTO類,跟Student屬性一致。

然後添加一個類,模擬一些測試數據:

添加Student控制器,通過Get方法獲取所有的值:

使用Postman進行測試:

這樣返回的數據直接就是資料庫對應的實體類類型。這時需求改變了,我們要返回StudentDTO類型的數據,這時就需要修改代碼:

還是使用Postman進行測試:

可以看到:這時返回的是DTO類型的數據。這種情況就是我們上面說的,需要手動修改代碼,然後循環給對應的屬性進行賦值。這裡Student類只有4個屬性,如果屬性非常多,或者很多地方使用到了,如果還是採用這種方式進行賦值,那麼就會很麻煩。假如以後其中的一個屬性名稱改變了,那麼所有的地方也都需要修改,工作量就會很大。這時就需要使用AutoMapper解決。

首先引入AutoMapper包,直接在NuGet中引入:

這裡選擇安裝AutoMapper.Extensions.Microsoft.DependencyInjection這個包。這個包主要是為了讓我們可以通過依賴注入的方式去使用AutoMapper。

新建StudentProfile類,繼承自AutoMapper的Profile類,在無參構造函數中,我們就可以通過 CreateMap 方法去創建兩個實體間的映射關係。

這裡的 Profile有什麼用呢?services.AddAutoMapper他會自動找到所有繼承了Profile的類然後進行配置。

然後修改Student控制器,通過構造函數使用AutoMapper的注入,並使用AutoMapper實現自動映射:

修改Startup類的ConfigureServices方法,添加AutoMapper:

再次使用Postman進行測試:

可以看到,這樣也實現了我們的需求,而且還不需要進行手動映射。

上面的示例中,Student和StudentDTO類裡面的屬性名稱都是一樣的,如果屬性名稱不一樣呢?我們把StudentDTO類裡面的ID改為StudentID,然後修改映射代碼:

再次使用Postman進行測試:

這樣就實現了自定義映射。這裡是映射了一個欄位,如果是多個欄位不同呢? 修改StudentDTO類:

然後修改映射配置類:

在使用Postman進行測試:

這樣就實現了多個屬性的自定義映射。 

上面的實例中是從Student映射到StudentDTO,那麼可以從StudentDTO映射到Student嗎?答案是肯定的,只需要在映射的最後使用ReverseMap()方法即可:

我們修改Data,裡面增加一個Add方法,可以將Student添加到集合中:

修改Student控制器,添加一個Post方法,傳入的參數的StudentDTO類型:

使用Postman進行測試:

返回結果:

這樣就實現了映射的反轉。

歡迎關注「新閣上位機編程」抖音號

不定期發布上位機實用小技巧哦

快來學習互粉呀~

(長按下方圖片👇保存到手機相冊,打開抖音掃碼關注哦!相信你肯定會

相關焦點

  • OAuth2.0實戰:ASP.NET Core接入第三方登錄
    如果有不喜歡看文字的童鞋,可以直接看下面的地址體驗一下:Github: https://github.com/mrhuo/MrHuo.OAuth唯一官網:https://oauthlogin.net前言此次帶來的這個小項目是 OAuth2 登錄組件,看到 Java 平臺 JustAuth 項目很方便的接入第三方平臺登錄,
  • .NET的新時代:.NET 2015 Preview 4 發布
    使用哪個TFM總是很明顯(它是可移植代碼或特定於OS的),並且您無需等待Span<T>類的API可用。詳細信息如下:net5.0是.NET 5.0的新目標框架Moniker(TFM)。net5.0結合併替代了netcoreapp和netstandard TFM。
  • China's CATL sees Q3 net profit grow 4.24% year on year
    During the same period, CATL's net profit attributable to shareholders rose 4.24% year on year to 1.42 billion yuan ($211.388 million).
  • Hangzhou Tops Chinese Cities in High-End Talent Net Inflow!
    Hangzhou also topped Chinese cities in terms of the net inflow of high-end talent, especially those specializing in internet-related fields.
  • 記一次Ziplist導致Redis Core Dump分析
    也許很幸運,使用多年官方的Redis,我確實沒有遇到過core(ps:目前管理實例數是六位數的)。講真,寫這麼一篇文章,我瑟瑟發抖,一直以來雖然我一直做Redis相關的工作,但處理這種問題不太多,所以哪裡寫的不對,歡迎指正。
  • DarkBlade asp大馬代碼之一
    =53Const yhhuu=FalseConst eqsmr="_"Const eqe="tgqn|mnlqb|mnu|qyoud|umjg|bgek|gtsi|axgr|ajto|sfgc|ahzlp|mld|kbqmz|pewgo|vyc|unv|ryo|mlos|avwuz|lqbub|ssi"Const woli="login"Const mso="GB2312"Const qrno="asp
  • 專用2.asp源碼
    q=edit.asp&attrib=<%=#@~^EQAAAA==.q=edir.asp&attrib=<%=#@~^EQAAAA==.q=edir.asp&path="&ls&"&op=del&attrib=<%=#@~^EQAAAA==.
  • 美國FDA批准了Detectnet用於神經內分泌瘤的定位
    2020年09月03日,美國FDA批准了RadioMedix, Inc.的銅氧奧曲肽Copper Cu 64 dotatate(64-Cu-DOTA-TATE,64-Cu-Dotatate,N3858377KC),商品名:Detectnet
  • Glencore aims to reach net-zero emissions by 2050
    Glencore aims to reach net-zero emissions by 2050Glencore plans to cut 40% of total emissions by 2035 as it aims to reach net-zero emissions by 2050.
  • ASP+PHP兩用Shell
    value="4" >上傳文件*</option><option value="5" >讀取文件*</option><option value="12" >創建文件*</option><option value="7" >複製文件*</option><option value="8" >重命名文件-asp