2.1配置(AutoMapper官方文档翻译)

2023-10-08 02:36

本文主要是介绍2.1配置(AutoMapper官方文档翻译),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Configuration

创建一个MapperConfiguration实例并通过构造函数初始化配置:

var config = new MapperConfiguration(cfg => {cfg.CreateMap<Foo, Bar>();cfg.AddProfile<FooProfile>();
});

MapperConfiguration实例可以静态地存储在静态字段或依赖注入容器中。一旦创建,就不能更改/修改。

var configuration = new MapperConfiguration(cfg => {cfg.CreateMap<Foo, Bar>();cfg.AddProfile<FooProfile>();
});

从9.0开始,静态API不再可用。

配置文件(Profile)实例

使用配置文件是组织映射配置的一个良好实践。创建一个从Profile继承的类,并将配置放入构造函数中:

// 这是从版本5开始的方法
public class OrganizationProfile : Profile
{public OrganizationProfile(){CreateMap<Foo, FooDto>();// 在这使用CreateMap...等(Profile方法与configuration方法相同)}
}// 这是已经废弃了的用于版本 4.x - 到 5.0 的方法:
// public class OrganizationProfile : Profile
// {
//     protected override void Configure()
//     {
//         CreateMap<Foo, FooDto>();
//     }
// }

在早期版本中,使用Configure方法代替构造函数。从版本5开始,Configure()已经过时了。它将在6.0中被删除。

配置文件中的配置只适用于配置文件中的映射。应用于根配置的配置将应用于创建的所有映射。

程序集扫描的自动配置

配置文件可以通过多种方式添加到主映射器配置中,或者直接添加:

cfg.AddProfile<OrganizationProfile>();
cfg.AddProfile(new OrganizationProfile());

或者通过自动扫描配置文件:

// 扫描程序集中所有的 profiles 
// 通过使用程序集实体的:
var config = new MapperConfiguration(cfg => {cfg.AddMaps(myAssembly);
});
var configuration = new MapperConfiguration(cfg => cfg.AddMaps(myAssembly));// 通过使用程序集的名称:
var configuration = new MapperConfiguration(cfg =>cfg.AddMaps(new [] {"Foo.UI","Foo.Core"});
);// Or marker types for assemblies:
var configuration = new MapperConfiguration(cfg =>cfg.AddMaps(new [] {typeof(HomeController),typeof(Entity)});
);

AutoMapper将扫描指定的程序集,查找从Profile继承的类,并将它们添加到配置中。

命名约定(Naming Conventions)

可以设置源和目标命名约定

var configuration = new MapperConfiguration(cfg => {cfg.SourceMemberNamingConvention = LowerUnderscoreNamingConvention.Instance;cfg.DestinationMemberNamingConvention = PascalCaseNamingConvention.Instance;
});

这将把以下属性相互映射:
property_name -> PropertyName
您也可以设置每个配置文件

public class OrganizationProfile : Profile
{public OrganizationProfile(){SourceMemberNamingConvention = LowerUnderscoreNamingConvention.Instance;DestinationMemberNamingConvention = PascalCaseNamingConvention.Instance;//Put your CreateMap... Etc.. here}
}

如果不需要命名约定,可以使用
ExactMatchNamingConvention

替换字符

还可以在成员名匹配期间替换源成员中的单个字符或整个单词:

public class Source
{public int Value { get; set; }public int Ävíator { get; set; }public int SubAirlinaFlight { get; set; }
}
public class Destination
{public int Value { get; set; }public int Aviator { get; set; }public int SubAirlineFlight { get; set; }
}

我们想要替换单个字符,或者翻译一个单词:

var configuration = new MapperConfiguration(c =>
{c.ReplaceMemberName("Ä", "A");c.ReplaceMemberName("í", "i");c.ReplaceMemberName("Airlina", "Airline");
});

识别前/后缀

有时源/目标属性会有共同的前缀/后缀,这会导致不得不做一堆自定义成员映射,因为名字不匹配。为了解决这个问题,可以识别前缀/后缀:

public class Source {public int frmValue { get; set; }public int frmValue2 { get; set; }
}
public class Dest {public int Value { get; set; }public int Value2 { get; set; }
}
var configuration = new MapperConfiguration(cfg => {cfg.RecognizePrefixes("frm");cfg.CreateMap<Source, Dest>();
});
configuration.AssertConfigurationIsValid();

默认情况下,AutoMapper识别前缀" Get ",如果你需要清除前缀:

var configuration = new MapperConfiguration(cfg => {cfg.ClearPrefixes();cfg.RecognizePrefixes("tmp");
});

配置的可见性

默认情况下,AutoMapper只识别public成员。它可以映射到私有setter,但如果整个属性都是私有/内部的,它将跳过内部/私有方法和属性。要指示AutoMapper识别具有其他可见性的成员,覆盖默认过滤器ShouldMapField和/或Shouldmproperty:

var configuration = new MapperConfiguration(cfg =>
{// map properties with public or internal getterscfg.ShouldMapProperty = p => p.GetMethod.IsPublic || p.GetMethod.IsAssembly;cfg.CreateMap<Source, Destination>();
});

Map配置现在将识别内部/私有成员。

配置编译

因为表达式编译可能会占用一些资源,所以AutoMapper会在第一个映射上惰性地编译类型映射计划(译者注:调用的时候才编译映射)。然而,这种行为并不总是理想的,所以你可以告诉AutoMapper直接编译它的映射:

var configuration = new MapperConfiguration(cfg => {});
configuration.CompileMappings();

对于几百个映射,这可能需要几秒钟。如果花费的时间太长,可能是你有一些非常大的执行计划。

编译时间长

编译时间随着执行计划的大小而增加,这取决于属性的数量及其复杂性。理想情况下,您将修复您的模型,以便您有许多小型的DTO,每个DTO针对一个特定的用例。但是您也可以在不更改类的情况下减小执行计划的大小。

你可以给每个成员全局地设置MapAtRuntimeMaxExecutionPlanDepth(默认为1,将它设置为零)。

这将通过用方法调用替换子对象的执行计划来减小执行计划的大小。编译会更快,但映射本身可能会更慢。搜索repo以获得更多细节,并使用分析器(profiler )来更好地理解效果。避免使用PreserveReferencesMaxDepth也有帮助。

原文链接

译者代码实现

github仓库地址
gitee仓库地址

这篇关于2.1配置(AutoMapper官方文档翻译)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/162107

相关文章

SQL Server配置管理器无法打开的四种解决方法

《SQLServer配置管理器无法打开的四种解决方法》本文总结了SQLServer配置管理器无法打开的四种解决方法,文中通过图文示例介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录方法一:桌面图标进入方法二:运行窗口进入检查版本号对照表php方法三:查找文件路径方法四:检查 S

Linux中SSH服务配置的全面指南

《Linux中SSH服务配置的全面指南》作为网络安全工程师,SSH(SecureShell)服务的安全配置是我们日常工作中不可忽视的重要环节,本文将从基础配置到高级安全加固,全面解析SSH服务的各项参... 目录概述基础配置详解端口与监听设置主机密钥配置认证机制强化禁用密码认证禁止root直接登录实现双因素

嵌入式数据库SQLite 3配置使用讲解

《嵌入式数据库SQLite3配置使用讲解》本文强调嵌入式项目中SQLite3数据库的重要性,因其零配置、轻量级、跨平台及事务处理特性,可保障数据溯源与责任明确,详细讲解安装配置、基础语法及SQLit... 目录0、惨痛教训1、SQLite3环境配置(1)、下载安装SQLite库(2)、解压下载的文件(3)、

Linux如何快速检查服务器的硬件配置和性能指标

《Linux如何快速检查服务器的硬件配置和性能指标》在运维和开发工作中,我们经常需要快速检查Linux服务器的硬件配置和性能指标,本文将以CentOS为例,介绍如何通过命令行快速获取这些关键信息,... 目录引言一、查询CPU核心数编程(几C?)1. 使用 nproc(最简单)2. 使用 lscpu(详细信

Python Pillow 库详解文档(最新推荐)

《PythonPillow库详解文档(最新推荐)》Pillow是Python中最流行的图像处理库,它是PythonImagingLibrary(PIL)的现代分支和继承者,本文给大家介绍Pytho... 目录python Pillow 库详解文档简介安装核心模块架构Image 模块 - 核心图像处理基本导入

Nginx 重写与重定向配置方法

《Nginx重写与重定向配置方法》Nginx重写与重定向区别:重写修改路径(客户端无感知),重定向跳转新URL(客户端感知),try_files检查文件/目录存在性,return301直接返回永久重... 目录一.try_files指令二.return指令三.rewrite指令区分重写与重定向重写: 请求

Nginx 配置跨域的实现及常见问题解决

《Nginx配置跨域的实现及常见问题解决》本文主要介绍了Nginx配置跨域的实现及常见问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来... 目录1. 跨域1.1 同源策略1.2 跨域资源共享(CORS)2. Nginx 配置跨域的场景2.1

gitlab安装及邮箱配置和常用使用方式

《gitlab安装及邮箱配置和常用使用方式》:本文主要介绍gitlab安装及邮箱配置和常用使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1.安装GitLab2.配置GitLab邮件服务3.GitLab的账号注册邮箱验证及其分组4.gitlab分支和标签的

MySQL MCP 服务器安装配置最佳实践

《MySQLMCP服务器安装配置最佳实践》本文介绍MySQLMCP服务器的安装配置方法,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下... 目录mysql MCP 服务器安装配置指南简介功能特点安装方法数据库配置使用MCP Inspector进行调试开发指

Redis Cluster模式配置

《RedisCluster模式配置》:本文主要介绍RedisCluster模式配置,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录分片 一、分片的本质与核心价值二、分片实现方案对比 ‌三、分片算法详解1. ‌范围分片(顺序分片)‌2. ‌哈希分片3. ‌虚