01.AutoMapper 之约定(Conventions)
转载(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设置默认值。
扩展能力
每个AddName和AddMember类型都基于接口ISourceToDestinationNameMapper和IChildMemberConfiguration。 您可以通过继承接口创建自己的类,通过lambda语句参数配置其属性,这样您就可以对AutoMapper如何解析属性映射进行微调。
多种配置
每个配置都是它自己的一套规则,所有这些规则都必须通过才能说明属性已映射。如果进行多种配置,则它们彼此完全分离。
配置文件(Profiles)
这些可以添加到Profile以及ConfigurationStore。
每个Profiles规则彼此分开,不会共享任何条件。如果从一个Profile的AddConditionalObjectMapper生成映射,则只能使用该'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)的更多相关文章
- X86调用约定 calling convention
http://zh.wikipedia.org/wiki/X86%E8%B0%83%E7%94%A8%E7%BA%A6%E5%AE%9A 这里描述了在x86芯片架构上的调用约定(calling con ...
- 使用AutoMapper
一.AutoMapper初探: [参考Using AutoMapper: Getting Started] 1.新建空的ASP.NET MVC项目. 2.在Models文件夹添加类: public c ...
- 一文为你详细讲解对象映射库【AutoMapper】所支持场景
前言 在AutoMapper未出世前,对象与对象之间的映射,我们只能通过手动为每个属性一一赋值,时间长了不仅是我们而且老外也觉得映射代码很无聊啊.这个时候老外的所写的强大映射库AutoMapper横空 ...
- .NET平台下,初步认识AutoMapper
初步认识AutoMapper AutoMapper 初步认识AutoMapper 前言 手动映射 使用AutoMapper 创建映射 Conventions 映射到一个已存在的实例对象 前言 通常 ...
- 初步认识AutoMapper
AutoMapper 初步认识AutoMapper 前言 手动映射 使用AutoMapper 创建映射 Conventions 映射到一个已存在的实例对象 前言 通常在一个应用程序中,我们开发 ...
- .net core启用 autoMapper
启用 autoMapper autoMapper 基于约定的对象映射器 目录 安装包 添加服务 书写映射关系 安装包 需要安装两个包:AutoMapper和AutoMapper.Extensi ...
- 00.AutoMapper 之入门指南(Getting Started Guide)
转载(https://www.jianshu.com/p/29ee5a94c1d9) 入门指南(Getting Started Guide) AutoMapper 是什么? AutoMapper 是一 ...
- 初步认识AutoMapper转载 https://www.cnblogs.com/fred-bao/p/5700776.html
初步认识AutoMapper AutoMapper 初步认识AutoMapper 前言 手动映射 使用AutoMapper 创建映射 Conventions 映射到一个已存在的实例对象 前言 通常 ...
- [.NET] - 初步认识AutoMapper
初步认识AutoMapper AutoMapper 初步认识AutoMapper 前言 手动映射 使用AutoMapper 创建映射 Conventions 映射到一个已存在的实例对象 前言 通常 ...
随机推荐
- Luogu P2678 跳石头
题目链接:Click here Solution: 最小值最大,显然二分,二分出mid后贪心去除石头,判断m次内是否可行即可 Code: #include<bits/stdc++.h> # ...
- 序列式容器————vector
目录 介绍 1 创建 2 容量和大小 size() capacity() 3 resize() 4 reverse() 5 获取元素 front() back() 6 迭代器(待补充) 7 push_ ...
- 洛谷P3948 数据结构——题解
题目传送 感觉这道题秀了我一地的智商... 审题没审好,没确定带修改的操作中询问的次数<=1000,且max和min都是事先给好.不变的.想了半天线段树.分块,却忘了最基础的暴力. 写不出题时先 ...
- 类锁和对象锁,synchronized修饰static方法与非static方法的区别
当synchronized修饰一个static方法时,多线程下,获取的是类锁(即Class本身,注意:不是实例), 作用范围是整个静态方法,作用的对象是这个类的所有对象. 当synchronized修 ...
- Java中用正则表达式截取字符串中
Java中用正则表达式截取字符串中第一个出现的英文左括号之前的字符串.比如:北京市(海淀区)(朝阳区)(西城区),截取结果为:北京市.正则表达式为() A ".*?(?=\\()" ...
- 5 个优秀前端 UI 框架
随着 Web 技术的不断发展,前端开发框架层出不穷,各有千秋,今天小编为大家奉上前端 UI 框架的开源项目,希望大家能够喜欢!如果大家有 UI 框架相关的开源项目,也可以托管到码云上,我们会及时给予推 ...
- Oracle开发:创建一个用户并分配表空间和分配权限
-- 创建一个用户并分配表空间和分配权限 -- 以sysdba登录 oracle@sha-col-oracle-2:~> sqlplus / as sysdba SQL*Plus: Releas ...
- 添加tomcat为启动服务/删除tomcat服务
在很多生产把环境下,tomcat的启动要随着windows的启动一起启动,这个时候就需要将tomcat添加成服务.步骤如下: 1:环境配置 配置jdk环境变量: JAVA_HOME:jdk路径 配置p ...
- windows下mingw编译faac
进入目录先运行 ./bootstrap 接着就可以 ./configure --without-mp4v2 然后 make make install
- ECMA Script 6新特性之解构赋值
1.基本概念用法 1.1解构赋值:ES6允许按照一定模式,从数组和对象中提取值,对变量进行赋值. var a = 1; var b = 2; var c = 3; /*上述赋值语句用解构赋值为*/ v ...