在做資料對映轉換的時候,假如想要將來源物件的某一種類型的資料一致轉換為另一種類型時,這個時候可以使用 Custom Type Converter,可以讓對映轉換的設定減少重複的程式碼。
這篇就用一個最容易明白的例子來做說明,就是將原本存為西元年的日期資料使用 Custom Type Converter,統一讓西元年的日期資料轉換為民國年格式的字串資料。
先來看看 AutoMapper 的 Wiki 裡如何說明 Custom Type Converters,
Custom type converters · AutoMapper/AutoMapper Wiki
https://github.com/AutoMapper/AutoMapper/wiki/Custom-type-converters
Custom Type Converters 型別轉換器
將類別的個別屬性之型別轉換的程式碼從對映設定裡獨立出來,減少對映設定裡過多的複雜邏輯;減少重複程式碼的出現。
這邊我使用 Northwind 的 Order 來做操作,另外建立一個 OrderDTO 類別,我們要將 Order 轉換為 OrderDTO,其中 OrderDate, RequiredDate, ShippedDate 這三個屬性要轉換為民國年格式的字串,
OrderDTO.cs
DataTimeExtensions.ToTaiwanCalendar()
建立一個 DateTime 的擴充方法 ToTaiwanCalendar(),注意的是一定要使用 TaiwanCalendar 來做轉換,別再用西元年減掉 1911 的方式來做轉換,
TaiwanDateTimeTypeConverter.cs
再來就是建立西元年轉換為民國年的 Custom Type Converter,最後的轉換是使用了剛才所建立的擴充方法,
OrderMappingProfile.cs
接著建立 OrderMappingProfile 類別,在 Configure() 方法裡除了建立 Order 與 OrderDTO 的對映轉換外,也要建立使用 TaiwanDateTimeTypeConverter 的日期型別轉換,
然後記得在 AutoMapperConfig 的 Mapper.Initialize() 加入 OrderMappingProfile,
在 OrderController 裡,取出 Order 資料後做對映轉換,
在 View 檢視頁面的 Model 類別是使用 OrderDTO
在顯示日期資料的地方並未做任何的特殊處理
執行結果
如果需要將來源資料的某一個屬性資料統一轉換為另一種型別時,就可以使用 Custom Type Converters 來做處理。
以上
也可以使用 Custom Value Resolvers 來做個別屬性的轉換處理,請看下一篇文章。
回覆刪除我就是-1911的方式,好文章記錄起來先。
回覆刪除請教一下,取得民國年,選擇 taiwanCalendar.GetYear(source) 與 source.Year-1911
回覆刪除不瞭解這兩者有何區別或考量 ?
單獨將西元年的年份減去 1911 的方式做處理也是可以,但是容易因為習慣而誤用 AddYears(-1911),尤其對 junior 開發人員容易造成混淆,新人如果不明白為何年份要特別處理為 Year - 1911,而天真的直接使用 AddYears(-1911) 還比較省事的時候,這時就產生了問題。
刪除用1911減去處理在「兩位數表示民國年份」時會有誤差,民國100年以後會出現錯誤
刪除