本篇AutoMapper使用场景:

※ 当源和目标具有同名的复杂类型属性、集合类型属性,这2种属性对应的类间也需建立映射

※ 一次性定义好源和目标的所有映射

※ 一次性定义好源和目标的所有映射,目标中有复杂类型属性

※ 一次性定义好源和目标的所有映射,目标中有复杂类型属性,为复杂类型创建自定义解析器

□ Domain model

public class BookStore

{

public string Name { get; set; }

public Address Address { get; set; }

public List<Book> Books { get; set; }

}

public class Address

{

public string Country { get; set; }

public string City { get; set; }

public string Street { get; set; }

public string PostCode { get; set; }

}

public class Book

{

public string Title { get; set; }

public string Description { get; set; }

public string Language { get; set; }

public decimal Price { get; set; }

public DateTime? PublishDate { get; set; }

public Publisher Publisher { get; set; }

public int? Paperback { get; set; }

public List<Author> Authors { get; set; }

}

public class Publisher

{

public string Name { get; set; }

}

public class Author

{

public string Name { get; set; }

public string Description { get; set; }

public ContanctInfo ContactIfno { get; set; }

}

public class ContanctInfo

{

public string Email { get; set; }

public string Blog { get; set; }

public string Twitter { get; set; }

}

□ View model

public class BookStoreDto

{

public string Name { get; set; }

public AddressDto Address { get; set; }

public List<BookDto> Books { get; set; }

}

public class AddressDto

{

public string Country { get; set; }

public string City { get; set; }

public string Street { get; set; }

public string PostCode { get; set; }

}

public class BookDto

{

public string Title { get; set; }

public string Description { get; set; }

public string Language { get; set; }

public decimal Price { get; set; }

public DateTime? PublishDate { get; set; }

public string Publisher { get; set; }

public int? Paperback { get; set; }

public string FirstAuthorName { get; set; }

public string FirstAuthorDescription { get; set; }

public string FirstAuthorEmail { get; set; }

public string FirstAuthorBlog { get; set; }

public string FirstAuthorTwitter { get; set; }

public string SecondAuthorName { get; set; }

public string SecondAuthorDescription { get; set; }

public string SecondAuthorEmail { get; set; }

public string SecondAuthroBlog { get; set; }

public string SecondAuthorTwitter { get; set; }

}

当源和目标具有同名的复杂类型属性、集合类型属性,这2种属性对应的类间也需建立映射

Mapper.CreateMap<BookStoreDto, BookStore>();

Mapper.CreateMap<AddressDto, Address>();

Mapper.CreateMap<BookDto, Book>();

BookStore bookStore = Mapper.Map<BookStoreDto, BookStore>(bookStoreDto);

一次性定义好源和目标的所有映射

Mapper.CreateMap<BookDto, ContanctInfo>()

.ConstructUsing(s => new ContanctInfo //第一个参数为源

{

Blog = s.FirstAuthorBlog,

Email = s.FirstAuthorEmail,

Twitter = s.FirstAuthorTwitter

});

ContanctInfo contactInfo = Mapper.Map<BookDto, ContanctInfo>(bookDto);

一次性定义好源和目标的所有映射,目标中有复杂类型属性

Mapper.CreateMap<BookDto, Author>()

.ConstructUsing(s => new Author

{

Name = s.FirstAuthorName,

Description = s.FirstAuthorDescription,

ContactIfno = new ContanctInfo {

Blog = s.FirstAuthorBlog,

Email = s.FirstAuthorEmail,

Twitter = s.FirstAuthorTwitter

}

});

Author author = Mapper.Map<BookDto, Author>(bookDto); //间接得到了ContactInfo

一次性定义好源和目标的所有映射,目标中有复杂类型属性,为复杂类型创建自定义解析器

Mapper.CreateMap<BookDto, Author>()

.ForMember(d => d.Name, opt => opt.MapFrom(s => s.FirstAuthorName))

.ForMember(d => d.Description, opt => opt.MapFrom(s => s.FirstAuthorDescription))

.ForMember(d => d.ContactIfno, opt => opt.ResolveUsing<FirstAuthorContactInfoResolver>());

Author author = Mapper.Map<BookDto, Author>(bookDto); //间接得到了ContactInfo

□ 自定义解析器

public class FirstAuthorContactInfoResolver : ValueResolver<BookDto, ContanctInfo>

{

protected override ContanctInfo ResolveCore(BookDto source)

{

return Mapper.Map<BookDto, ContanctInfo>(source);

}

}

AutoMapper在MVC中的运用06-一次性定义映射、复杂类型属性映射的更多相关文章

  1. AutoMapper在MVC中的运用01-配置、使用、单元测试、举例

    MVC中,如果想在Domain Model和View Model之间建立映射,用AutoMapper是一个不错的选择.不仅如此,AutoMapper能在不同对象之间建立映射,比如string与int类 ...

  2. AutoMapper在MVC中的运用小结

    配置.单元测试.AOP注入 Decimal转换成String类型 源数组转换成目标数组 源中的集合(数组)属性转换成目标中的集合(数组)属性 子类父类间的映射 源字典集合转换成目标字典集合 枚举映射 ...

  3. AutoMapper在MVC中的运用04-string映射各种类型、一个属性映射多个属性等

    本篇AutoMapper使用场景: ※ 类型转换,源string类型分别转换成int, DateTime,Type ※ 源和目标都包含复杂类型属性 ※ 把源中的一个属性映射到目标中的多个属性 类型转换 ...

  4. AutoMapper在MVC中的运用03-字典集合、枚举映射,自定义解析器

    本篇AutoMapper使用场景: ※ 源字典集合转换成目标字典集合 ※ 枚举映射 ※ 自定义解析器 ※ 源中的复杂属性和Get...方法转换成目标属性 源字典集合转换成目标字典集合 □ Domain ...

  5. AutoMapper在MVC中的运用02-Decimal转String、集合、子父类映射

    本篇AutoMapper使用场景: ※ Decimal转换成String类型 ※ 源数组转换成目标数组 ※ 源中的集合(数组)属性转换成目标中的集合(数组)属性 ※ 子类父类间的映射 Decimal转 ...

  6. AutoMapper在MVC中的运用07-映射在订单场景的例子

    本文参考了Taswar Bhatti的博客,他写了<Instant AutoMapper>这本书.遗憾的是,这本电子版书在国内还买不到,也下载不到.也只能从他的有限几篇博文中来窥探一二了. ...

  7. AutoMapper在MVC中的运用05-映射中的忽略、处理null、多种映射转换

    本篇AutoMapper使用场景: ※ 动态实现接口方法或属性 ※ 目标中的属性如果比源多,可以忽略多出的属性 ※ 目标有virtual属性,可忽略 ※ 目标属性值为null的解决办法 ※ int转s ...

  8. Asp.net Mvc中利用ValidationAttribute实现xss过滤

    在网站开发中,需要注意的一个问题就是防范XSS攻击,Asp.net mvc中已经自动为我们提供了这个功能.用户提交数据时时,在生成Action参数的过程中asp.net会对用户提交的数据进行验证,一旦 ...

  9. 在Asp.Net MVC中使用ModelBinding构造Array、List、Collection以及Dictionary

    在asp.net mvc中,我们可以在html表单中使用特定的格式传递参数,从而通过model binder构造一些集合类型. 第一种方式 public ActionResult Infancy(Pe ...

随机推荐

  1. Go语言Windows 10开发环境搭建:Eclipse+GoClipse

    Intel Core i5-8250U,Windows 10家庭中文版,go version go1.11 windows/amd64, Eclipse IDE for C/C++ Developer ...

  2. python基础--模块使用

      一:模块介绍 模块分为三种: 自定义模块 内置标准模块(又称标准库) 开源模块 自定义模块使用 # -*- coding:utf-8 -*- __author__ = 'shisanjun' &q ...

  3. LeetCode(15): 每k个一组翻转链表

    hard! 题目描述: 给出一个链表,每 k 个节点为一组进行翻转,并返回翻转后的链表. k 是一个正整数,它的值小于或等于链表的长度.如果节点总数不是 k 的整数倍,那么将最后剩余节点保持原有顺序. ...

  4. SqlServer中 SET DATEFIRST更改

    在 SQL Server 中默认情况下,每周的开始都是从周日开始算起的,如果默认星期一呢? 这里有三种方式可以解决这个问题: 一:直接通过 SET DATEFIRST VALUE 来更改重新生成新的 ...

  5. shell学习(三)

    libvirt用于管理KVM本身的工具 virt-install用于安装虚拟机需要的安装包,安装虚拟机 virt-mananger:管理创建删除虚拟机的工具 ---恢复内容开始--- 1    gre ...

  6. Atom组件

    Atom组件 最近用Atom写博客比较多,然后发现一个很严重的问题.. 没有一个我想要的上传图片的方式,比如某乎上边就可以直接copy/paste文件,然后进行上传. 然而在Atom上没有找到类似的插 ...

  7. P1890 gcd区间

    P1890 gcd区间我一开始80分暴力,模拟100做法dpO(n^2+m)f[i][j]表示i到j的 gcd初始化f[i][i]=i;f[i][j]=gcd(f[i][j-1],a[j]);这样查询 ...

  8. 《Population Based Training of Neural Networks》论文解读

      很早之前看到这篇文章的时候,觉得这篇文章的思想很朴素,没有让人眼前一亮的东西就没有太在意.之后读到很多Multi-Agent或者并行训练的文章,都会提到这个算法,比如第一视角多人游戏(Quake ...

  9. Odoo创建基础模块和相关内容

    Odoo创建模块 这里我先引用一下几篇文章,这里完整的实现了一个odoo的模块创建demo https://segmentfault.com/a/1190000014047552 https://se ...

  10. 关于XML解析中的CDATA的简单介绍

    所有 XML 文档中的文本均会被解析器解析. 只有 CDATA 区段(CDATA section)中的文本会被解析器忽略. PCDATA PCDATA 指的是被解析的字符数据(Parsed Chara ...