HTML5技术

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

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

var user = new User(){Id = 1 ,Age = 10 ,Name = ,CreatedTime = DateTime.Now,ModifiedTime = DateTime.Now};Mapper.Initialize(cfg = cfg.CreateMapUser, UserDTO ()); var userDTO = Mapper.MapUser, UserDTO(u

var user = new User() { Id = 1, Age = 10, Name = , CreatedTime = DateTime.Now, ModifiedTime = DateTime.Now }; Mapper.Initialize(cfg => cfg.CreateMap<User, UserDTO>()); var userDTO = Mapper.Map<User, UserDTO>(user);

好了,看来也是支持的,我们总结来一个:AutoMapper从映射源到映射目标支持继承。讲完关于类的继承,我们来看看复杂对象,这下AutoMapper想必要有点挑战了吧。

public class Address { public string City { get; set; } public string State { get; set; } public string Country { get; set; } } public class AuthorModel { public int Id { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public Address Address { get; set; } }

public class AuthorDTO { public int Id { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public string City { get; set; } public string State { get; set; } public string Country { get; set; } }

static void Main(string[] args) { var author = new AuthorModel() { Id = 1, FirstName = , LastName = , Address = new Address() { City = , State = , Country = } }; Mapper.Initialize(cfg => cfg.CreateMap<AuthorModel, AuthorDTO>()); var authorDTO = Mapper.Map<AuthorModel, AuthorDTO>(author); Console.ReadKey(); }

哇喔,我说AutoMapper还能有这么智能,那还要我们程序员干嘛,在AuthorDTO中我们将Address扁平化为简单属性,所以此时利用Map不再是万能的,我们需要手动在创建映射配置时通过ForMember方法来自定义指定映射属性来源,从映射源中的Address复杂对象属性到AuthorDTO中属性上。

var author = new AuthorModel() { Id = 1, FirstName = , LastName = , Address = new Address() { City = , State = , Country = } }; Mapper.Initialize(cfg => cfg.CreateMap<AuthorModel, AuthorDTO>() .ForMember(d => d.City, o => o.MapFrom(s => s.Address.City)) .ForMember(d => d.State, o => o.MapFrom(s => s.Address.State)) .ForMember(d => d.Country, o => o.MapFrom(s => s.Address.Country)) ); var authorDTO = Mapper.Map<AuthorModel, AuthorDTO>(author);

如上所给片段代码,对于AuthorDTO中的City属性,我们指定其值来源于映射源中复杂属性Address中的City,其余同理,同时对于其他在相同层次上的属性不会进行覆盖。

默认情况下AutoMapper会将同名且不区分大小写的属性进行映射,比如对于有些属性为了节省传输流量且完全不需要用到的属性,我们压根没必要进行映射,此时AutoMapper中有Ignore方法来忽略映射,如下代码片段将忽略对属性Id的映射。

Mapper.Initialize(cfg => cfg.CreateMap<AuthorModel, AuthorDTO>() .ForMember(d => d.Id, o => o.Ignore()) );

到此我们又可以来一个总结:AutoMapper支持从映射源到映射目标的扁平化。实际上AutoMapper支持扁平化映射,但是前提是遵守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

网友点评
=