在ASP.NET Core中使用AutoMapper


普通的模型映射

現在有兩個類,實體類Student和返回展示的 View類StudentView

 


 

 

兩個實體類字段還基本可以,不是很多,假如字段非常非常多,還需要手動去賦值的話,簡直太痛苦了。


 

 

想了想這才是一個方法,一般的系統都會少則幾十,多則上百個這樣的方法,這還不算,大家肯定遇到過一個情況,如果有一天要在頁面多顯示一個字段,噗!不是吧,首先要存在數據庫,然后在該實體類就應該多一個,然后再在每一個賦值的地方增加一個,而且也沒有更好的辦法不是,一不小心就少了一個,然后被產品測試說咱們不細心,心塞喲,別慌!神器來了,一招搞定。

先來引入DTO講解

我們已經知道了ORM(Object Relational Mapping)映射,是一種對象關系的映射,對象-關系映射(ORM)系統一般以中間件的形式存在,主要實現程序對象到關系數據庫數據的映射。

而Automapper是一種實體轉換關系的模型,AutoMapper是一個.NET的對象映射工具。主要作用是進行領域對象與模型(DTO)之間的轉換、數據庫查詢結果映射至實體對象。

引入AutoMapper的包


 

在Services層中引用Nuget包,AutoMapper 和 AutoMapper.Extensions.Microsoft.DependencyInjection

AutoMapper.Extensions.Microsoft.DependencyInjection,這個是用來配合依賴注入的,

在項目當中,都使用依賴注入,盡量不要用new 來實例化,導致層耦合

添加映射文件 AutomapperConfig.cs

在web項目中,新建文件夾,Automapper,添加配置映射配置文件AutomapperConfig.cs,繼承自Profile類,用來配置所有的映射關系。


 


這里的 Profile有什么用呢,是 services.AddAutoMapper他會自動找到所有繼承了Profile的類然后進行配置。我這個類是放在Web層的,如果Profile配置放在其他的層比如Service層,如下圖:直接耦合

 


 

使用AutoMapper實現模型映射,並注入

那此時Startup類里面的配置就可以寫成 services.AddAutoMapper(Assembly.Load("Service"));它會自動加載Service的程序集並從這里面找到繼承了profile類的配置實現。

 

如果profile配置放在了web層,那就相當於把配置類和Service層進行了解耦,那么配置中可以寫

 


 

實現接口的方法中使用mapper

 


 

控制器調用接口,並傳輸數據,最終在index頁面上顯示:

 


 

 


 

前端顯示:

 


 

是不是少了一個Name呢,原因是,我們配置的source和destination兩個類的字段不是完全相同的,但是有時候這兩個字段實際上是相同的。

我們可以,加上配置:

 


 

如果不想映射某個字段:我們還可以:

 


 

這樣子,我們完成了映射類的配置:忽略age的映射,並將原始類的name給到StudentView的StudentName,這樣子,前端顯示肯定是18消失了,轉而出現了張國榮字樣,我們來看看是不是呢?

 


 

哦?張國榮字樣確實出來了,可為什么會多出個0呢?

原因是,在C#的數據類型當中,int類型屬於值類型,是不能為空的,默認給了0,我們嘗試將model實體類的age改為可空類型試試。

 


 

前端測試如下:

 


 

果然age消失了。好了今天的學習就到這里結束了,歡迎關注微信公眾號:dotNET學習天地

一起學習和進步,與君共勉之。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM