AutoMapper的使用

高斋晓开卷,独共圣人语。这篇文章主要讲述AutoMapper的使用相关的知识,希望能为你提供帮助。
常规的使用,一般先初始化配置,一个应用只需初始化一次

Mapper.Initialize(cfg => cfg.CreateMap< Order, OrderDto> ()); //or var config = new MapperConfiguration(cfg => cfg.CreateMap< Order, OrderDto> ());

var mapper = config.CreateMapper(); // or var mapper = new Mapper(config); OrderDto dto = mapper.Map< OrderDto> (order); // or OrderDto dto = Mapper.Map< OrderDto> (order);

使用AutoMapper进行Entity与DTO之间的转换,不同字段之间的映射转换
AutoMapper.Mapper.Initialize(cfg => cfg.CreateMap< StreetEvent, StreetEventDTO> () .ForMember(dest => dest.EvtSrc, opt => opt.MapFrom(src =https://www.songbingjia.com/android/> src.evt_src)) .ForMember(dest => dest.MapId, opt => opt.MapFrom(src => src.map_id)) ); var targetList = AutoMapper.Mapper.Map< List< StreetEventDTO> > (list);

实体之间的自定义类型转换,参考:
【AutoMapper的使用】https://github.com/AutoMapper/AutoMapper/wiki/Custom-type-converters
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; } }[Test] public void Example() { Mapper.Initialize(cfg => { cfg.CreateMap< string, int> ().ConvertUsing(Convert.ToInt32); cfg.CreateMap< string, DateTime> ().ConvertUsing(new DateTimeTypeConverter()); cfg.CreateMap< string, Type> ().ConvertUsing< TypeTypeConverter> (); cfg.CreateMap< Source, Destination> (); }); Mapper.AssertConfigurationIsValid(); var source = new Source { Value1 = "5", Value2 = "01/01/2000", Value3 = "AutoMapperSamples.GlobalTypeConverters.GlobalTypeConverters+Destination" }; Destination result = Mapper.Map< Source, Destination> (source); result.Value3.ShouldEqual(typeof (Destination)); }public class DateTimeTypeConverter : ITypeConverter< string, DateTime> { public DateTime Convert(string source, DateTime destination, ResolutionContext context) { return System.Convert.ToDateTime(source); } }public class TypeTypeConverter : ITypeConverter< string, Type> { public Type Convert(string source, Type destination, ResolutionContext context) { return context.SourceType; } }

自定义实体值的转换,适用于目标与源实体直接的值类型计算,参考
https://github.com/AutoMapper/AutoMapper/wiki/Custom-value-resolvers
public class Source { public int Value1 { get; set; } public int Value2 { get; set; } }public class Destination { public int Total { get; set; } }public class CustomResolver : IValueResolver< Source, Destination, int> { public int Resolve(Source source, Destination destination, int member, ResolutionContext context) { return source.Value1 + source.Value2; } }Mapper.Initialize(cfg => cfg.CreateMap< Source, Destination> () .ForMember(dest => dest.Total, opt => opt.ResolveUsing< CustomResolver> ()); Mapper.AssertConfigurationIsValid(); var source = new Source { Value1 = 5, Value2 = 7 }; var result = Mapper.Map< Source, Destination> (source); result.Total.ShouldEqual(12);

public class MultBy2Resolver : IValueResolver< object, object, int> { public int Resolve(object source, object dest, int destMember, ResolutionContext context) { return destMember * 2; } }Mapper.Initialize(cfg => cfg.CreateMap< Source, Destination> () .ForMember(dest => dest.Total, opt => opt.ResolveUsing(new CustomResolver()) ); Mapper.Initialize(cfg => { cfg.CreateMap< Source, Destination> () .ForMember(dest => dest.Total, opt => opt.ResolveUsing< CustomResolver, decimal> (src =https://www.songbingjia.com/android/> src.SubTotal)); cfg.CreateMap< OtherSource, OtherDest> () .ForMember(dest => dest.OtherTotal, opt => opt.ResolveUsing< CustomResolver, decimal> (src => src.OtherSubTotal)); }); public class CustomResolver : IMemberValueResolver< object, object, decimal, decimal> { public decimal Resolve(object source, object destination, decimal sourceMember, decimal destinationMember, ResolutionContext context) { // logic here } }

 

    推荐阅读