最近還挺忙,還有點累,一直都沒更新了,實在是懶呀。正題之前先說點別的,最近公司要擴張了,需要大量開發,領導說推薦有錢可以拿,如此好機會,我就趁機做個廣告。ShippingRen.com招募.NET高級開發,坐標上海,有興趣的給我留言,或者加我qq:1029183866,加的時候請說明博客園看到。
另外在說說這幾天,工作忙是不可避免,業余也在准備自己的網站www.capqueen.com(目前還在備案中),准備用目前會的技術從無到有建立一個CMS(博客),到時候也會發一些文章和大家分享。最近還有一個想法,因為工作的關系用了很多框架和組件,大多數是github上的,我在考慮我研究過了之後稍微有些心得,是不是再搬運來和大家分享。目前在看的有FluentValidation和ServiceStack。
好了回歸正題,這篇文章我會和大家分享關於AutoMapper的自定義轉換規則。相信大家如果有在用的話,一定會遇到目標對象和源對象屬性名字對應但是類型不對應,該如何解決呢?。
還是照樣上場景,首先有以下兩個類:
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; } }
上面的類如果按照普通的轉換的話,顯然要報錯,錯誤如下:
AutoMapper.AutoMapperMappingException: Missing type map configuration or unsupported mapping.//AutoMapper Mapping異常,找不到相應的類型配置或者不支持的Mapping
因此我們需要給Mapping指定相應的類型轉換,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);
這種很簡單,直接指定了一個方法,這裡是使用了System.Convert裡的默認轉換,當然咱們也可以自定義只要是一個Func<TSource, TDestination>就可以了。
再來看剩下兩種,這兩種使用了接口ITypeConverter<in TSource, out TDestination>, 這個接口是AutoMapper提供的用於自定義的類型轉換的實現。咱們看看實現,如下:
public class DateTimeTypeConverter : ITypeConverter<string, DateTime> { public DateTime Convert(ResolutionContext context) { return System.Convert.ToDateTime(context.SourceValue);//使用了默認的Convert,這裡注意這個context是上下文,附帶了轉換時的參數信息 } } public class TypeTypeConverter : ITypeConverter<string, Type> { public Type Convert(ResolutionContext context) { return context.SourceType;//使用源屬性的類型 } }
然後再來看看使用方法:
Mapper.CreateMap<string, DateTime>().ConvertUsing(new DateTimeTypeConverter()); Mapper.CreateMap<string, Type>().ConvertUsing<TypeTypeConverter>();
自定義類型轉換的好處在於,我們只要定義一次就可以在所有轉換裡都可以使用。但是我想,會不會存在一些情況,例如TypeA => TypeB 我們有多種轉換需求?這樣的場景,看起來AutoMapper無法采用自定義類型轉換了。不知道有沒有哪位知道如何處理的,請留言~
其實在我看來很多時候直接用自定義映射就已經可以解決掉了上面的問題,類型轉換只是AutoMapper提供的一種遍歷,感覺也說不上特別需要。
本篇文章搬運自:https://github.com/AutoMapper/AutoMapper/wiki/Custom-type-converters
下篇我會和大家分享關於自定義屬性處理的文章,<AutoMapper搬運工之自定義屬性計算>/另外我還在寫一篇關於數據驗證的文章,歡迎大家到時候來拍磚。