網頁

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 來處理。

 

以上

沒有留言:

張貼留言