在實際的項目開發過程中,我們使用各種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進行測試:
返回結果:
這樣就實現了映射的反轉。
歡迎關注「新閣上位機編程」抖音號
不定期發布上位機實用小技巧哦
快來學習互粉呀~
(長按下方圖片👇保存到手機相冊,打開抖音掃碼關注哦!相信你肯定會)