转载(https://www.jianshu.com/p/d4c472d95da4

 

约定(Conventions)

条件对象映射器

条件对象映射器根据源类型和目标类型之间的条件生成新类型映射。

var config = new MapperConfiguration(cfg => {
cfg.AddConditionalObjectMapper().Where((s, d) => s.Name == d.Name + "Dto");
});

成员配置

成员配置与配置类似,但您可以完全控制已使用和未使用的内容。

var config = new MapperConfiguration(cfg => { cfg.AddMemberConfiguration(); });

AddMemberConfiguration() 以空配置开始。 所有适用的配置都将失效。

命名约定

AddMemberConfiguration().AddMember<NameSplitMember>() 获取默认的命名约定功能。

可以通过将lambda传递给参数来覆盖源和目标成员命名约定。 SourceExtentionMethods也可以在这里设置。

如果您没有设置任何内容,AutoMapper将使用DefaultMember,它只会使用属性的名称进行检查。

PS:如果不设置这个,扁平化的对象映射将被禁用。

替换字符

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是其中之一,它将根据提供的名称匹配属性。

public class Foo
{
[MapTo("SourceOfBar")]
public int Bar { get; set; }
}

AutoMapper Getting 的默认值

AddMemberConfiguration().AddMember<NameSplitMember>().AddName<PrePostfixName>(_ => _.AddStrings(p => p.Prefixes, "Get"))

如果不使用AddMemberConfiguration(),则由Configuration设置默认值。

扩展能力

每个AddNameAddMember类型都基于接口ISourceToDestinationNameMapperIChildMemberConfiguration。 您可以通过继承接口创建自己的类,通过lambda语句参数配置其属性,这样您就可以对AutoMapper如何解析属性映射进行微调。

多种配置

每个配置都是它自己的一套规则,所有这些规则都必须通过才能说明属性已映射。如果进行多种配置,则它们彼此完全分离。

配置文件(Profiles)

这些可以添加到Profile以及ConfigurationStore。

每个Profiles规则彼此分开,不会共享任何条件。如果从一个ProfileAddConditionalObjectMapper生成映射,则只能使用该'Profile'的AddMemberConfigurations来解析属性映射。

例子

下面显示的是两个Profile,用于制定与数据传输对象(Data Transfer Object)之间传输的约定。 每个都被一种映射方式隔离 并且都明确规定了规则。

// 使用NameSplitMember规则进行对象扁平化
// 仅适用于具有相同名称且目标类型以Dto结尾的
// 仅适用于源属性后缀为Dto的
public class ToDTO : Profile
{
protected override void Configure()
{
AddMemberConfiguration()
.AddMember<NameSplitMember>()
.AddName<PrePostfixName>(
_ => _.AddStrings(p => p.Postfixes, "Dto"));
AddConditionalObjectMapper().Where((s, d) => s.Name == d.Name + "Dto");
}
} // 不扁平化对象
// 仅适用于具有相同名称且源类型以Dto结尾的
// 仅适用于目标属性后缀为Dto的
public class FromDTO : Profile
{
protected override void Configure()
{
AddMemberConfiguration().AddName<PrePostfixName>(
_ => _.AddStrings(p => p.DestinationPostfixes, "Dto"));
AddConditionalObjectMapper().Where((s, d) => d.Name == s.Name + "Dto");
}
}

01.AutoMapper 之约定(Conventions)的更多相关文章

  1. X86调用约定 calling convention

    http://zh.wikipedia.org/wiki/X86%E8%B0%83%E7%94%A8%E7%BA%A6%E5%AE%9A 这里描述了在x86芯片架构上的调用约定(calling con ...

  2. 使用AutoMapper

    一.AutoMapper初探: [参考Using AutoMapper: Getting Started] 1.新建空的ASP.NET MVC项目. 2.在Models文件夹添加类: public c ...

  3. 一文为你详细讲解对象映射库【AutoMapper】所支持场景

    前言 在AutoMapper未出世前,对象与对象之间的映射,我们只能通过手动为每个属性一一赋值,时间长了不仅是我们而且老外也觉得映射代码很无聊啊.这个时候老外的所写的强大映射库AutoMapper横空 ...

  4. .NET平台下,初步认识AutoMapper

    初步认识AutoMapper AutoMapper 初步认识AutoMapper 前言 手动映射 使用AutoMapper 创建映射 Conventions 映射到一个已存在的实例对象   前言 通常 ...

  5. 初步认识AutoMapper

      AutoMapper 初步认识AutoMapper 前言 手动映射 使用AutoMapper 创建映射 Conventions 映射到一个已存在的实例对象   前言 通常在一个应用程序中,我们开发 ...

  6. .net core启用 autoMapper

    启用 autoMapper   autoMapper 基于约定的对象映射器 目录 安装包 添加服务 书写映射关系 安装包   需要安装两个包:AutoMapper和AutoMapper.Extensi ...

  7. 00.AutoMapper 之入门指南(Getting Started Guide)

    转载(https://www.jianshu.com/p/29ee5a94c1d9) 入门指南(Getting Started Guide) AutoMapper 是什么? AutoMapper 是一 ...

  8. 初步认识AutoMapper转载 https://www.cnblogs.com/fred-bao/p/5700776.html

    初步认识AutoMapper AutoMapper 初步认识AutoMapper 前言 手动映射 使用AutoMapper 创建映射 Conventions 映射到一个已存在的实例对象   前言 通常 ...

  9. [.NET] - 初步认识AutoMapper

    初步认识AutoMapper AutoMapper 初步认识AutoMapper 前言 手动映射 使用AutoMapper 创建映射 Conventions 映射到一个已存在的实例对象   前言 通常 ...

随机推荐

  1. 序列式容器————array

    目录 介绍 1 构造函数 2 fill() 3 元素的获取 4 size() 5 empty() 6 front() 7 back() 8 get<n> 9 迭代器(待补充) 10 元素的 ...

  2. 利用word宏功能一键导出数据库表结构

    前言: 需求是: 为了完成<数据库设计文档>中的表结构展示,需要导出所有的表结构,包括字段名.长度.注释等必要标题. 数据库:MySQL 我选择的方法是——用word的宏功能导出.很多博客 ...

  3. 详解cocos2dx 3.0的release版本在android平台的签名过程

    当您的游戏准备发布前,需要编译成为release版本,命令中需要增加 -m release,编译命令如下: cocos compile -p android -m release 在编译结束后,生成x ...

  4. FP回写阶段卡住或报错

    FP在autosap阶段往往会因各种各样的因素导致回写报错,卡住等异常: 本次由于一个视图的性能突然下降导致回写长期卡住没有完成: 这时如果要重新执行回写的话就要检查哪部分的数据回写到SAP端,一般有 ...

  5. es之零停机重新索引数据

    实际生产,对于文档的操作,偶尔会遇到这种问题: 某一个字段的类型不符合后期的业务了,但是当前的索引已经创建了,我们知道es在字段的mapping建立后就不可再次修改mapping的值 比如: 1): ...

  6. Java并发编程的艺术笔记(三)——Thread.join()

    t.join()方法只会使主线程进入等待池并等待t线程执行完毕后才会被唤醒.并不影响同一时刻处在运行状态的其他线程.它能够使得t.join()中的t优先执行,当t执行完后才会执行其他线程.能够使得线程 ...

  7. 快速排序和二分查找(Javascript)

    var data = [8, 3, 4, 1, 18, 22, 11, 3, 5, 6, 2, 1, 77] quickSort(data, 0, data.length - 1) console.l ...

  8. Mysql 创建函数出现This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA

    This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary mys ...

  9. 九、设置RF自定义的日志输出路径

    在Arguments输入-d E:\\robot,每次运行完都会发送该目录日志

  10. 2018-5 - 凉经 - 乐糖游戏 - PHP 开发实习生

    收到面试通知当天因为学校出事要求我明天必须回去,所以就买当晚的火车票,然后跟公司说学校有事明天没法去面试了,公司人事比较好给我安排到当天下午面试.公司规模不是很大,但位置好下了地铁到,可能因为招的是实 ...