AutoMapper搬运工之自定义类型转换
前言
最近還挺忙,還有點(diǎn)累,一直都沒(méi)更新了,實(shí)在是懶呀。正題之前先說(shuō)點(diǎn)別的,最近公司要擴(kuò)張了,需要大量開(kāi)發(fā),領(lǐng)導(dǎo)說(shuō)推薦有錢(qián)可以拿,如此好機(jī)會(huì),我就趁機(jī)做個(gè)廣告。ShippingRen.com招募.NET高級(jí)開(kāi)發(fā),坐標(biāo)上海,有興趣的給我留言,或者加我qq:1029183866,加的時(shí)候請(qǐng)說(shuō)明博客園看到。
另外在說(shuō)說(shuō)這幾天,工作忙是不可避免,業(yè)余也在準(zhǔn)備自己的網(wǎng)站www.capqueen.com(目前還在備案中),準(zhǔn)備用目前會(huì)的技術(shù)從無(wú)到有建立一個(gè)CMS(博客),到時(shí)候也會(huì)發(fā)一些文章和大家分享。最近還有一個(gè)想法,因?yàn)楣ぷ鞯年P(guān)系用了很多框架和組件,大多數(shù)是github上的,我在考慮我研究過(guò)了之后稍微有些心得,是不是再搬運(yùn)來(lái)和大家分享。目前在看的有FluentValidation和ServiceStack。
好了回歸正題,這篇文章我會(huì)和大家分享關(guān)于AutoMapper的自定義轉(zhuǎn)換規(guī)則。相信大家如果有在用的話,一定會(huì)遇到目標(biāo)對(duì)象和源對(duì)象屬性名字對(duì)應(yīng)但是類(lèi)型不對(duì)應(yīng),該如何解決呢?。
自定義類(lèi)型轉(zhuǎn)換規(guī)則(Custom type converters)
還是照樣上場(chǎng)景,首先有以下兩個(gè)類(lèi):
public class Source{public string Value1 { get; set; }public string Value2 { get; set; }public string Value3 { get; set; }}public class Destination{public int Value1 { get; set; }public DateTime Value2 { get; set; }public Type Value3 { get; set; }}上面的類(lèi)如果按照普通的轉(zhuǎn)換的話,顯然要報(bào)錯(cuò),錯(cuò)誤如下:
AutoMapper.AutoMapperMappingException: Missing type map configuration or unsupported mapping.//AutoMapper Mapping異常,找不到相應(yīng)的類(lèi)型配置或者不支持的Mapping因此我們需要給Mapping指定相應(yīng)的類(lèi)型轉(zhuǎn)換,AutoMapper提供了3種方式:
void ConvertUsing(Func<TSource, TDestination> mappingFunction); void ConvertUsing(ITypeConverter<TSource, TDestination> converter); void ConvertUsing<TTypeConverter>() where TTypeConverter : ITypeConverter<TSource, TDestination>;首先看第一種
Mapper.CreateMap<string, int>().ConvertUsing(System.Convert.ToInt32);這種很簡(jiǎn)單,直接指定了一個(gè)方法,這里是使用了System.Convert里的默認(rèn)轉(zhuǎn)換,當(dāng)然咱們也可以自定義只要是一個(gè)Func<TSource, TDestination>就可以了。
再來(lái)看剩下兩種,這兩種使用了接口ITypeConverter<in TSource, out TDestination>, 這個(gè)接口是AutoMapper提供的用于自定義的類(lèi)型轉(zhuǎn)換的實(shí)現(xiàn)。咱們看看實(shí)現(xiàn),如下:
public class DateTimeTypeConverter : ITypeConverter<string, DateTime>{public DateTime Convert(ResolutionContext context){return System.Convert.ToDateTime(context.SourceValue);//使用了默認(rèn)的Convert,這里注意這個(gè)context是上下文,附帶了轉(zhuǎn)換時(shí)的參數(shù)信息}}public class TypeTypeConverter : ITypeConverter<string, Type>{public Type Convert(ResolutionContext context){return context.SourceType;//使用源屬性的類(lèi)型}}然后再來(lái)看看使用方法:
Mapper.CreateMap<string, DateTime>().ConvertUsing(new DateTimeTypeConverter());Mapper.CreateMap<string, Type>().ConvertUsing<TypeTypeConverter>();?
總結(jié)
自定義類(lèi)型轉(zhuǎn)換的好處在于,我們只要定義一次就可以在所有轉(zhuǎn)換里都可以使用。但是我想,會(huì)不會(huì)存在一些情況,例如TypeA => TypeB 我們有多種轉(zhuǎn)換需求?這樣的場(chǎng)景,看起來(lái)AutoMapper無(wú)法采用自定義類(lèi)型轉(zhuǎn)換了。不知道有沒(méi)有哪位知道如何處理的,請(qǐng)留言~
其實(shí)在我看來(lái)很多時(shí)候直接用自定義映射就已經(jīng)可以解決掉了上面的問(wèn)題,類(lèi)型轉(zhuǎn)換只是AutoMapper提供的一種遍歷,感覺(jué)也說(shuō)不上特別需要。
?
本篇文章搬運(yùn)自:https://github.com/AutoMapper/AutoMapper/wiki/Custom-type-converters
下篇我會(huì)和大家分享關(guān)于自定義屬性處理的文章,<AutoMapper搬運(yùn)工之自定義屬性計(jì)算>/另外我還在寫(xiě)一篇關(guān)于數(shù)據(jù)驗(yàn)證的文章,歡迎大家到時(shí)候來(lái)拍磚。
轉(zhuǎn)載于:https://www.cnblogs.com/capqueen/p/AuoMaperCustomerTypeConvert.html
總結(jié)
以上是生活随笔為你收集整理的AutoMapper搬运工之自定义类型转换的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: hook_theme 的重要性
- 下一篇: Django项目:CRM(客户关系管理系