2014年6月1日 星期日

AutoMapper Custom Value Resolvers 的應用 - 指定個別日期型別屬性轉換為民國年格式

在上一篇「AutoMapper Custom Type Converters 的應用 - 將所有日期資料轉換為民國年格式」為各位說明了怎麼將取出資料裡的西元年日期型別資料使用 Custom Type Converter 轉換為民國年格式字串,因為是使用了 Type Converter 所以會統一處理指定型別的轉換,那如果我們不想要統一處理而是想要指定某個欄位做轉換,而其他的日期欄位不需要做轉換,這樣的情況就可以使用 Custom Value Resolvers 來做處理。

之前曾經寫過一篇文章說明 Custom Value Resolvers「AutoMapper - Complex Type 使用 Custom value resolvers 設定屬性轉換」,不過使用的情況與這一次的要說明的並不相同。

 


先來看看 AutoMapper 的 Wiki 裡如何說明 Custom Value Resolvers,

Custom value resolvers · AutoMapper/AutoMapper Wiki

https://github.com/AutoMapper/AutoMapper/wiki/Custom-value-resolvers

 

Custom Value Resolvers 值解析器

將值解析的程式碼從對映設定裡獨立出來,減少對映設定裡過多的複雜邏輯。

 

這邊同樣使用 Order 與 OrderDTO 類別,不過這次並不會把三個日期型別(OrderDate, RequiredDate, ShippedDate)的屬性資料都轉為民國年格式字串,這次只會指定 OrderDate 這個屬性資料轉換為民國年格式字串。

image

 

DataTimeExtensions.ToTaiwanCalendar()

而西元年轉換民國年格式字串一樣是沿用 DateTimeExtensions.ToTaiwanCalendar(),

image

 

TaiwanDateTimeValueResolver.cs

建立 TaiwanDateTimeValueResolver.cs,主要是繼承 ValueResolver<TSource, TDestinnation> 並且實作 ResolveCore 方法,

image

 

OrderMappingProfile.cs

接著要修改 OrderMappingProfile 類別,原本已經使用 TaiwanDateTimeTypeConverter 來統一處理 Order 對映到 OrderDTO 的日期型別資料轉換,而現在我們只需要單獨對 OrderDate 做轉換而已,所以在建立對映轉換的設定時就要對 OrderDate 做額外的設定,使用 ResolveUsing<TValueResolver> 並指定用剛才所建立的 TaiwanDateTimeValueResolver,最後記得要使用 FromMember 讓對映轉換知道資料來源是那一個。

image

 

P.S. 小技巧
我在建立對映轉換設定的時候,在 ForMember 方法裡會去特別使用三個英文字母來做區別,分別是 d, p, s(也可以使用 dest, opt, src),其實說穿了就只是讓我清楚知道分別代表什麼意思,讓程式可讀性提高,三個英文字母分別代表的是:「d –> Destinnation (destinationMember) 目的」「o –> Option (memberOptions) 選擇項目」「s –> Source (sourceMember) 來源」。

 

執行結果

image

 

有時候我會需要對 bool 型別的資料做文字的描述,例如「是、否」「啟用、不啟用」「上架、下架」「顯示、不顯示」等,這時候就可以使用 Custom Value Resolvers 來處理。

 

以上

沒有留言:

張貼留言

提醒

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