在上一篇「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 這個屬性資料轉換為民國年格式字串。
DataTimeExtensions.ToTaiwanCalendar()
而西元年轉換民國年格式字串一樣是沿用 DateTimeExtensions.ToTaiwanCalendar(),
TaiwanDateTimeValueResolver.cs
建立 TaiwanDateTimeValueResolver.cs,主要是繼承 ValueResolver<TSource, TDestinnation> 並且實作 ResolveCore 方法,
OrderMappingProfile.cs
接著要修改 OrderMappingProfile 類別,原本已經使用 TaiwanDateTimeTypeConverter 來統一處理 Order 對映到 OrderDTO 的日期型別資料轉換,而現在我們只需要單獨對 OrderDate 做轉換而已,所以在建立對映轉換的設定時就要對 OrderDate 做額外的設定,使用 ResolveUsing<TValueResolver> 並指定用剛才所建立的 TaiwanDateTimeValueResolver,最後記得要使用 FromMember 讓對映轉換知道資料來源是那一個。
P.S. 小技巧
我在建立對映轉換設定的時候,在 ForMember 方法裡會去特別使用三個英文字母來做區別,分別是 d, p, s(也可以使用 dest, opt, src),其實說穿了就只是讓我清楚知道分別代表什麼意思,讓程式可讀性提高,三個英文字母分別代表的是:「d –> Destinnation (destinationMember) 目的」「o –> Option (memberOptions) 選擇項目」「s –> Source (sourceMember) 來源」。
執行結果
有時候我會需要對 bool 型別的資料做文字的描述,例如「是、否」「啟用、不啟用」「上架、下架」「顯示、不顯示」等,這時候就可以使用 Custom Value Resolvers 來處理。
以上
沒有留言:
張貼留言