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的属性 ...
随机推荐
- [ 高并发]Java高并发编程系列第二篇--线程同步
高并发,听起来高大上的一个词汇,在身处于互联网潮的社会大趋势下,高并发赋予了更多的传奇色彩.首先,我们可以看到很多招聘中,会提到有高并发项目者优先.高并发,意味着,你的前雇主,有很大的业务层面的需求, ...
- .NET Core 首例 Office 开源跨平台组件(NPOI Core)
前言 最近项目中,需要使用到 Excel 导出,找了一圈发现没有适用于 .NET Core的,不依赖Office和操作系统限制的 Office 组件,于是萌生了把 NPOI 适配并移植到 .NET C ...
- Partition:Partiton Scheme是否指定Next Used?
在SQL Server中,为Partition Scheme多次指定Next Used,不会出错,最后一次指定的FileGroup是Partition Scheme的Next Used,建议,在执行P ...
- HTML5 语义元素(二)文本内容
上一篇介绍的是关于页面结构方面的语义元素,本篇介绍文本内容方面,包含:<bdi>.<details>.<summary>.<mark>.<outp ...
- css3更改input单选和多选的样式
在项目开发中我们经常会遇到需要更改input单选和多选样式的情况,今天就给大家介绍一种简单改变input单选和多选样式的办法. 在这之前先简单介绍一下:before伪类 :before 选择器向选定的 ...
- 【干货分享】流程DEMO-补打卡
流程名: 补打卡申请 业务描述: 当员工在该出勤的工作日出勤但漏打卡时,于一周内填写补打卡申请. 流程相关文件: 流程包.xml 流程说明: 直接导入流程包文件,即可使用本流程 表单: 流程: 图片 ...
- java.lang.NoSuchFieldError: org.apache.http.message.BasicLineFormatter.INSTANCE
Android发出HTTP请求时出现了这个错误: java.lang.NoSuchFieldError: org.apache.http.message.BasicLineFormatter.INST ...
- Microsoft Visual Studio 2015 下载、注册、安装过程、功能列表、问题解决
PS:请看看回复.可能会有文章里没有提到的问题.也许会对你有帮助哦~ 先上一张最终的截图吧: VS2015正式版出了,虽然没有Ultimate旗舰版,不过也是好激动的说.哈哈.可能有的小伙伴,由于工作 ...
- CentOS 7 安装出现 /dev/root does not exits 导致无法安装的问题
本人在官网下的是这个 CentOS-7-x86_64-DVD-1611.iso ,然后用UltraISO 9.6制作的U盘启动盘,不过在安装的时候出现了这个错误, 然后也是搜了好久,试了一下,下面这个 ...
- zone.js - 暴力之美
在ng2的开发过程中,Angular团队为我们带来了一个新的库 – zone.js.zone.js的设计灵感来源于Dart语言,它描述JavaScript执行过程的上下文,可以在异步任务之间进行持久性 ...