普通的模型映射
現在有兩個類,實體類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學習天地
一起學習和進步,與君共勉之。