HTML5技术

一文为你详细讲解对象映射库【AutoMapper】所支持场景 - Jeffcky(4)

字号+ 作者:H5之家 来源:H5之家 2017-10-08 12:03 我要评论( )

老铁妥妥没毛病,通过此种方式即使嵌套多层依然也是能够解析,只不过我们得手动多几个配置罢了不是,这里我们又来一个结论: 在映射复杂对象中的集合属性时,我们需要配置集合属性的映射,然后在复杂对象中再次映射

老铁妥妥没毛病,通过此种方式即使嵌套多层依然也是能够解析,只不过我们得手动多几个配置罢了不是,这里我们又来一个结论:在映射复杂对象中的集合属性时,我们需要配置集合属性的映射,然后在复杂对象中再次映射集合属性

AutoMapper高级版

AutoMapper太强大了,我给跪了,强大到这篇幅不够,得手动下拉滚动条继续磕。废话少说,我们再来看看AutoMapper使用高级版,自定义值解析,动态对象映射、类型转换等。

自定义值解析

AutoMapper支持自定义解析,只不过我们需要实现IValueResolver接口才行,下面我们来看看。

public class Customer { public bool VIP { get; set; } } public class CustomerDTO { public string VIP { get; set; } }

实现IValueResolver接口,对映射源加以判断返回映射目标中的字符串。

public class VIPResolver : IValueResolver<Customer, CustomerDTO, string> { public string Resolve(Customer source, CustomerDTO destination, string destMember, ResolutionContext context) { : ; } }

然后在映射配置时使用ResolveUsing来实现上述自定义解析,使用方式有如下两种。

var customer = new Customer() { VIP = true }; Mapper.Initialize(cfg => { cfg.CreateMap<Customer, CustomerDTO>() .ForMember(cv => cv.VIP, m => m.ResolveUsing<VIPResolver>()); }); //或者 //Mapper.Initialize(cfg => //{ // cfg.CreateMap<Customer, CustomerDTO>() // .ForMember(cv => cv.VIP, m => m.ResolveUsing(new VIPResolver())); customerDTO = Mapper.Map<Customer, CustomerDTO>(customer);

动态对象映射 

public class Customer { public int Id { get; set; } public string Name { get; set; } }

dynamic customer = new ExpandoObject(); customer.Id = 5; customer.Name = ; Mapper.Initialize(cfg => { }); var result = Mapper.Map<Customer>(customer); dynamic foo2 = Mapper.Map<ExpandoObject>(result);

类型转换 

关于上述自定义值解析,我们同样可以用类型转换类实现,在AutoMapper中存在ConvertUsing方法,该方法类似于C#中的投影一样,如下:

Mapper.Initialize(cfg => { cfg.CreateMap<Customer, CustomerDTO>() .ConvertUsing(s => new CustomerDTO() { VIP = s.VIP ? : }); });

或者

public class CustomTypeConverter : ITypeConverter<Customer, CustomerDTO> { public CustomerDTO Convert(Customer source, CustomerDTO destination, ResolutionContext context) { return new CustomerDTO { VIP = source.VIP ? : , }; } }

Mapper.Initialize(cfg => { cfg.CreateMap<Customer, CustomerDTO>() .ConvertUsing(new CustomTypeConverter()); });

AutoMapper太强大了,上述已经给出大部分我们基本上会用到的场景,AutoMapper还支持依赖注入,同时最爽的是有了AutoMapper.QueryableExtensions扩展方法,这针对使用EF的童鞋简直是福音啊。 通过ProjectTo方法即可映射从数据库查询出的IQueryable类型数据。

IQueryable<Customer> customers = null; var customersDTO = customers.ProjectTo<CustomerDTO>();

总结

AutoMapper强大到给跪了,目前该项目已被.NET基金会所支持,看过的,路过的,没用过的,赶紧走起用起来啊,有时间还会更新AutoMapper其他用途,想必上述场景已经够我们用了吧,如果你觉得不够用,请私信我,我再加上啊。

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • electron打包成桌面应用程序的详细介绍 - YouForMe

    electron打包成桌面应用程序的详细介绍 - YouForMe

    2017-08-18 08:01

  • 抓包工具 - Fiddler(详细介绍) - 一加一

    抓包工具 - Fiddler(详细介绍) - 一加一

    2017-06-15 16:01

  • Redis 集群搭建详细指南 - Mafly

    Redis 集群搭建详细指南 - Mafly

    2017-06-14 10:00

  • 致DBA:为什么你经常犯错,是因为你做的功课不够 - 飞鸿无痕

    致DBA:为什么你经常犯错,是因为你做的功课不够 - 飞鸿无痕

    2017-05-21 08:00

网友点评