2014年5月31日 星期六

AutoMapper Custom Type Converters 的應用 - 將所有日期資料轉換為民國年格式

在做資料對映轉換的時候,假如想要將來源物件的某一種類型的資料一致轉換為另一種類型時,這個時候可以使用 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 這三個屬性要轉換為民國年格式的字串,

image

OrderDTO.cs

image

 

DataTimeExtensions.ToTaiwanCalendar()

建立一個 DateTime 的擴充方法 ToTaiwanCalendar(),注意的是一定要使用 TaiwanCalendar 來做轉換,別再用西元年減掉 1911 的方式來做轉換,

image

 

TaiwanDateTimeTypeConverter.cs

再來就是建立西元年轉換為民國年的 Custom Type Converter,最後的轉換是使用了剛才所建立的擴充方法,

image

 

OrderMappingProfile.cs

接著建立 OrderMappingProfile 類別,在 Configure() 方法裡除了建立 Order 與 OrderDTO 的對映轉換外,也要建立使用 TaiwanDateTimeTypeConverter 的日期型別轉換,

image

然後記得在 AutoMapperConfig 的 Mapper.Initialize() 加入 OrderMappingProfile,

image

 

在 OrderController 裡,取出 Order 資料後做對映轉換,

image

 

在 View 檢視頁面的 Model 類別是使用 OrderDTO

image

在顯示日期資料的地方並未做任何的特殊處理

image

 

執行結果

image

 

如果需要將來源資料的某一個屬性資料統一轉換為另一種型別時,就可以使用 Custom Type Converters 來做處理。

 

以上

5 則留言:

  1. 也可以使用 Custom Value Resolvers 來做個別屬性的轉換處理,請看下一篇文章。

    回覆刪除
  2. 我就是-1911的方式,好文章記錄起來先。

    回覆刪除
  3. 請教一下,取得民國年,選擇 taiwanCalendar.GetYear(source) 與 source.Year-1911
    不瞭解這兩者有何區別或考量 ?

    回覆刪除
    回覆
    1. 單獨將西元年的年份減去 1911 的方式做處理也是可以,但是容易因為習慣而誤用 AddYears(-1911),尤其對 junior 開發人員容易造成混淆,新人如果不明白為何年份要特別處理為 Year - 1911,而天真的直接使用 AddYears(-1911) 還比較省事的時候,這時就產生了問題。

      刪除
    2. 用1911減去處理在「兩位數表示民國年份」時會有誤差,民國100年以後會出現錯誤

      刪除

提醒

千萬不要使用 Google Talk (Hangouts) 或 Facebook 及時通訊與我聯繫、提問,因為會掉訊息甚至我是過了好幾天之後才發現到你曾經傳給我訊息過,請多多使用「詢問與建議」(在左邊,就在左邊),另外比較深入的問題討論,或是有牽涉到你實作程式碼的內容,不適合在留言板裡留言討論,請務必使用「詢問與建議」功能(可以夾帶檔案),謝謝。