AutoMapper(二)
首先,先创建一个控制台项目,引用AutoMapper程序集,创建三个类User,UserDto,UserMappingProfile,下面的知识点的演示都以此项目为基础,代码分别如下:
namespace MiddleAutoMapper
{
public class User
{
public User()
{
}
public int Age { get; set; }
}
}
namespace MiddleAutoMapper
{
public class UserDto
{
public UserDto(int age)
{
this.age = age;
} private int age;
public int Age
{
get { return age; }
}
}
}
namespace MiddleAutoMapper
{
public class UserMappingProfile:Profile
{
protected override void Configure()
{
//添加配置方法 }
}
}
namespace MiddleAutoMapper
{
class Program
{
static void Main(string[] args)
{
//初始化配置
Mapper.Initialize(cfg =>
{
cfg.AddProfile<UserMappingProfile>();
}); var u1 = Mapper.Map<UserDto>(new User() {Age = });
Console.WriteLine(u1.Age); Console.Read();
}
}
}
构造
AutoMapper可以根据源类型的成员映射到目标类型的构造函数里:
在UserMappingProfile文件中添加配置方法代码:
Mapper.CreateMap<User, UserDto>();
因为AutoMapper会对大小不敏感(case insensitive),所以会将User的Age属性通过UserDto的构造函数进行映射,并对UserDto的私有字段赋值,最后通过公有的Age属性打印出来。

但是,这是在UserDto的构造函数参数名和User的Age属性名相同的情况下,如果不相同呢?比如,将构造函数的参数名改为age1呢?

发现报错了,所以我们要修改配置方法,如下:
Mapper.CreateMap<User, UserDto>().ForCtorParam("age1", opt => opt.MapFrom(src => src.Age));
解释一下ForCtorParam()方法,看名字是针对构造函数参数的,官方解释该方法的作用是对于个别的构造函数参数进行自定义配置。该方法有两个参数,第一个是string类型的构造函数参数名,第二个是一个参数选项Action方法。
我上面这句代码的意思就是说将目标类型的构造函数的参数“age1”从源类型的Age属性进行映射。

容器
AutoMapper支持使用静态服务地址构造自定义值格式化器,自定义值解析器和自定义类型转换器(后面会说):
Mapper.Initialize(cfg =>
{
cfg.ConstructServicesUsing(ObjectFactory.GetInstance); cfg.CreateMap<Source, Destination>();
});
或者在基于实例的容器使用的动态服务地址(包括子容器或嵌套容器):
var dest = Mapper.Map<Source, Destination>(new Source { Value = },
opt => opt.ConstructServicesUsing(childContainer.GetInstance));
惯例
条件对象映射器
条件对象映射器基于源类型和目标类型之间的条件生成新的类型映射。
首先将User和UserDto的构造函数去掉,配置文件中Configure方法中的代码只写入下面这句代码:
AddConditionalObjectMapper().Where((s, d) => d.Name == s.Name + "Dto");
解释:如果目标类型的名称等于源类型的名称加上“Dto”,那么就生成一个源类型和目标类型的对象映射器。添加了这一句,就不需要CreateMap方法了。
在这连个类中加入属性:
public string UserName { get; set; }

可见,即使没有使用CreateMap方法,同样映射成功了。
成员配置
成员配置就像配置(Configuration)一样,但是你可以完全控制用什么和不用什么。
Mapper.Initialize(cfg => { cfg.AddMemberConfiguration(); });
AddMemberConfiguration()方法以空白状态开启。默认情况下,应用到Configuration中的所有东西都是从这里开始的。
- 命名惯例
AddMemberConfiguration().AddMember<NameSplitMember>();
这句代码可以获得默认的命名惯例。也可以通过参数传递Lambda重写源和目标的命名惯例。如果你没设置任何东西,那么AutoMapper会使用DefaultMember,它会只检测用到的属性名称。PS:如果没设置这个,那么对象的扁平化(Flattening)就不可用。
- 替换字符
AddMemberConfiguration().AddName<ReplaceName>(_ => _.AddReplace("Ä", "A").AddReplace("í", "i")); - 识别前后缀
AddMemberConfiguration().AddName<PrePostfixName>(_ => _.AddStrings(p => p.Prefixes, "Get", "get").AddStrings(p => p.DestinationPostfixes, "Set"));
- 特性支持
AddMemberConfiguration().AddName<SourceToDestinationNameMapperAttributesMember>();
这个默认总是开启的。它会寻找含有“SourceToDestinationMapperAttribute”特性的属性所在的实例,并且调用用户定义的isMatch函数类找出匹配的成员。
MapToAttribute是特性之一,它可以匹配基于给定名称的属性。
在User类中加入代码:[MapToAttribute("Phone")]
public string Tel { get; set; }在UserDto中加入代码:
public string Phone { get; set; }在Main方法中加入代码:
var u3 = Mapper.Map<UserDto>(new User() {Tel = ""});
Console.WriteLine(u3.Phone);//执行结果如下:

- 获取AutoMapper默认值
AddMemberConfiguration().AddMember<NameSplitMember>().AddName<PrePostfixName>(_ => _.AddStrings(p => p.Prefixes, "Get"))
如果没使用AddMemberConfiguration方法,那么这就是Configuration设置的默认值。
扩展性
AddName和AddMember中的每个类型都是基于ISourceToDestinationNameMapper和IChildMemberConfiguration接口的。也可以创建自己的类通过Lambda语句参数来配置属性,因此你可以微调AutoMapper如何解析属性映射。
配置文件
配置文件可以加到Profile和ConfigurationStore中。
每一个配置文件都独立于另外一个,且不会共享任何条件。如果一个映射是从一个配置文件(profile)中的AddConditionalObjectMapper生成的,那么可以使用此配置文件的AddMemberConfigurations来解析属性映射。
AutoMapper(二)的更多相关文章
- 从我做起[AutoMapper实现模块化注册自定义扩展MapTo<>()].Net Core 之二
AutoMapper实现模块化注册自定义扩展MapTo<>() 我们都知道AutoMapper是使用的最多的实体模型映射,如果没有AutoMapper做对象映射那么我们需要想一下是怎么写的 ...
- AutoMapper的介绍与使用(二)
AutoMapper的匹配 1,智能匹配 AutoMapper能够自动识别和匹配大部分对象属性: 如果源类和目标类的属性名称相同,直接匹配,不区分大小写 目标类型的CustomerName可以匹配源类 ...
- DTO学习系列之AutoMapper(二)
本篇目录: Flattening-复杂到简单 Projection-简单到复杂 Configuration Validation-配置验证 Lists and Array-集合和数组 Nested m ...
- 一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](二)
前言: 在本系列第一篇<一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](一)>中,我为大家介绍了搭建空白解决方案以 ...
- ioc初步理解(二) 简单实用autofac搭建mvc三层+automapper=》ioc(codeFirst)
之前在园子闲逛的时候,发现许多关于automapper的文章,以及用aotufac+automapper合在一起用.当然发现大多数文章是将automapper的特点说出或将automapper几处关键 ...
- AutoMapper
什么是AutoMapper? AutoMapper是一个对象和对象间的映射器.对象与对象的映射是通过转变一种类型的输入对象为一种不同类型的输出对象工作的.让AutoMapper有意思的地方在于它提供了 ...
- 使用Adminlite + ASP.NET MVC5(C#) + Entityframework + AutoFac + AutoMapper写了个api接口文档管理系统
一.演示: 接口查看:http://apidoc.docode.top/ 接口后台:http://apiadmin.docode.top/ 登录:administrator,123456 二.使用到的 ...
- 使用AutoMapper进行对象间映射
在开发过程中,难免遇到下面这种情况:两个(或多个)对象所拥有的大多数属性是重复的,我们需要在对象间进行映射(即将一个对象的属性值赋给另一个对象.通常我们可以进行如下操作: A a=new A(); a ...
- AutoMapper 使用实践
一. 使用意图 常常在开发过程中,碰到一个实体上的属性值,要赋值给另外一个相类似实体属性时,且属性有很多的情况.一般不利用工具的话,就要实例化被赋值实体B,然后再将实体A的字段一个个赋值给B的属性 ...
随机推荐
- 菜鸟学Struts2——Results
在对Struts2的Action学习之后,对Struts2的Result进行学习.主要对Struts2文档Guides中的Results分支进行学习,如下图: 1.Result Types(Resul ...
- Win10 IIS本地部署网站运行时图片和样式不正常?
后期会在博客首发更新:http://dnt.dkill.net 异常处理汇总-服 务 器 http://www.cnblogs.com/dunitian/p/4522983.html 启用关闭win功 ...
- JavaScript权威指南 - 数组
JavaScript数组是一种特殊类型的对象. JavaScript数组元素可以为任意类型,最大容纳232-1个元素. JavaScript数组是动态的,有新元素添加时,自动更新length属性. J ...
- HTML骨架结构
前面的话 一个完整的HTML文档必须包含3个部分:文档声明.文档头部和文档主体.而正是它们构成了HTML的骨架结构.前面已经分别介绍过文档声明和文档头部,本文将详细介绍构成HTML骨架结构的基础元 ...
- 多线程爬坑之路-Thread和Runable源码解析
多线程:(百度百科借一波定义) 多线程(英语:multithreading),是指从软件或者硬件上实现多个线程并发执行的技术.具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提 ...
- spring源码分析之freemarker整合
FreeMarker是一款模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页.电子邮件.配置文件.源代码等)的通用工具. 它不是面向最终用户的,而是一个Java类库,是一款程 ...
- 【热门技术】EventBus 3.0,让事件订阅更简单,从此告别组件消息传递烦恼~
一.写在前面 还在为时间接收而烦恼吗?还在为各种组件间的消息传递烦恼吗?EventBus 3.0,专注于android的发布.订阅事件总线,让各组件间的消息传递更简单!完美替代Intent,Handl ...
- Linux主机上使用交叉编译移植u-boot到树莓派
0环境 Linux主机OS:Ubuntu14.04 64位,运行在wmware workstation 10虚拟机 树莓派版本:raspberry pi 2 B型. 树莓派OS: Debian Jes ...
- 【夯实PHP基础】nginx php-fpm 输出php错误日志
本文地址 原文地址 分享提纲: 1.概述 2.解决办法(解决nginx下php-fpm不记录php错误日志) 1. 概述 nginx是一个web服务器,因此nginx的access日志只有对访问页面的 ...
- iOS从零开始学习直播之1.播放
对于直播来说,客户端主要做两件事情,推流和播放.今天先讲播放. 播放流程 1.拉流:服务器已有直播内容,从指定地址进行拉取的过程.其实就是向服务器请求数据. 2.解码:对视屏数据进行解压缩. 3. ...