配置(Configuration)

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

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

MapperConfiguration可以静态存储在静态字段或者依赖注入容器中。一经创建就无法更改/修改。

或者,您可以使用静态Mapper实例初始化AutoMapper:

Mapper.Initialize(cfg => {
cfg.CreateMap<Foo, Bar>();
cfg.AddProfile<FooProfile>();
});

配置文件实例

使用配置文件来组织你的映射配置是一个很好的方式。创建继承自Profile的类并把配置写在构造函数中:

// 这种方式从5.0版本开始
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.0版本中,Configure() 已经过时并在6.0版本中移除。

Configuration 内部的配置文件仅适用于配置文件内部的映射。Configuration 应用于根配置,则适用于所有被创建的映射。

自动配置之程序集扫描

配置文件有多种方式可以直接添加到主映射配置中:

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

or by automatically scanning for profiles:

// 在程序集中扫描所有配置
//使用实例的方式:
var config = new MapperConfiguration(cfg => {
cfg.AddProfiles(myAssembly);
});
//使用静态的方式:
Mapper.Initialize(cfg => cfg.AddProfiles(myAssembly)); //也可以使用程序集名称:
Mapper.Initialize(cfg =>
cfg.AddProfiles(new [] {
"Foo.UI",
"Foo.Core"
});
); // 还可以使用程序集类型:
Mapper.Initialize(cfg =>
cfg.AddProfiles(new [] {
typeof(HomeController),
typeof(Entity)
});
);

Automapper将扫描指定的程序集,将继承自Profile的类添加到配置中。

命名约定

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

Mapper.Initialize(cfg => {
cfg.SourceMemberNamingConvention = new LowerUnderscoreNamingConvention();
cfg.DestinationMemberNamingConvention = new PascalCaseNamingConvention();
});

以下属性将相互映射:property_name - > PropertyName

你也可以在每个配置文件级别设置命名约定。

public class OrganizationProfile : Profile
{
public OrganizationProfile()
{
SourceMemberNamingConvention = new LowerUnderscoreNamingConvention();
DestinationMemberNamingConvention = new PascalCaseNamingConvention();
//将CreateMap 等等放在这里
}
}

字符替换

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

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; }
}

替换一个字符或者转换一个单词:

Mapper.Initialize(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; }
}
Mapper.Initialize(cfg => {
cfg.RecognizePrefixes("frm");
cfg.CreateMap<Source, Dest>();
});
Mapper.AssertConfigurationIsValid();

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

Mapper.Initialize(cfg => {
cfg.ClearPrefixes();
cfg.RecognizePrefixes("tmp");
});

全局属性/字段过滤

AutoMapper默认尝试映射所有的公共属性/字段。你可以使用属性/字段过滤器来过滤掉属性/字段:

Mapper.Initialize(cfg =>
{
// 不映射任何字段
cfg.ShouldMapField = fi => false; // 映射getter为公共或私有的属性
cfg.ShouldMapProperty = pi =>
pi.GetMethod != null && (pi.GetMethod.IsPublic || pi.GetMethod.IsPrivate);
});

配置可见性

AutoMapper默认只识别公共成员。虽然也能映射私有setters,但是会跳过整个属性为internal/private中internal/private的方法和属性。为了教会AutoMapper识别其它可见级别的成员,覆盖默认过滤器ShouldMapField、ShouldMapProperty:

Mapper.Initialize(cfg =>
{
// 映射getter 可见级别为public 或者internal 的属性
cfg.ShouldMapProperty = p => p.GetMethod.IsPublic || p.GetMethod.IsAssembly;
cfg.CreateMap<Source, Destination>();
});

Map 配置现在将识别 internal/private 成员。

Configuration 编译

因为表达式编译可能会占用大量资源,所以AutoMapper延迟编译类型映射,并计划在第一次执行映射的时候编译。但是,这种行为并不能总让人满意,所以你也可以告诉AutoMapper直接编译映射:

Mapper.Initialize(cfg => {});
Mapper.Configuration.CompileMappings();

对于几百个映射,这可能需要几秒钟。

重置静态映射配置

静态Mapper.Initialize意味着只被调用一次。重置的静态映射配置(例如,在测试开始时):

Mapper.Reset();

Mapper.Initialize(cfg => { /* 重新配置 */ });

不应在生产代码中使用重置。它的意义在于支持测试场景。

17.AutoMapper 之配置(Configuration)的更多相关文章

  1. 05.AutoMapper 之配置验证(Configuration Validation)

    https://www.jianshu.com/p/5901a5d1ef15 配置验证(Configuration Validation) 手写映射配置代码虽然繁琐,但具有可测试的优点.AutoMap ...

  2. Asp.NetCore源码学习[2-1]:配置[Configuration]

    Asp.NetCore源码学习[2-1]:配置[Configuration] 在Asp. NetCore中,配置系统支持不同的配置源(文件.环境变量等),虽然有多种的配置源,但是最终提供给系统使用的只 ...

  3. [翻译] AKKA笔记- ACTORSYSTEM (配置CONFIGURATION 与调度SCHEDULING) - 4(一)

    原文在http://rerun.me/2014/10/06/akka-notes-actorsystem-in-progress/ 像我们前面看到的,我们可以用ActorSystem的actorof方 ...

  4. .NET Core 配置Configuration杂谈

    前言 .NET Core 在配置文件的操作上相对于.NET Framework做了不少改变,今天来聊一聊.关于Configuration的Package都是以Microsoft.Extensions. ...

  5. asp.net core 系列 11 配置configuration (下)

    四. 文件配置提供程序AddIniFile. AddXmlFile.AddJsonFile FileConfigurationProvider 是从文件系统加载配置的基类. 以下配置提供程序专用于特定 ...

  6. asp.net core 系列 10 配置configuration (上)

    一.  ASP.NET Core 中的配置概述 ASP.NET Core 中的应用配置是基于键值对,由configuration 程序提供. configuration  将从各种配置源提供程序操作键 ...

  7. 【Spring】28、Spring中基于Java的配置@Configuration和@Bean用法.代替xml配置文件

    Spring中为了减少xml中配置,可以生命一个配置类(例如SpringConfig)来对bean进行配置. 一.首先,需要xml中进行少量的配置来启动Java配置: <?xml version ...

  8. ASP.NET Web.config文件的配置(Configuration API)

    本次我们讨论主要聚焦在以下Web.config配置文件的设置值的读取. 1.<connectionString />连接字符串的读取. 2.<appSettings />应用程 ...

  9. 17. Spring Boot 配置嵌入式Servlet容器

    一.如何定制和修改Servlet容器的相关配置 1.配置文件(ServerProperties): 优先级最高 server.port=8081 server.context‐path=/crud s ...

随机推荐

  1. STCubeMX软件新建Keil和IAR工程使用步骤:

    STCubeMX软件新建Keil和IAR工程使用步骤:首先是软件下载(也可在我们的百度云下载):1.STCubeMX下载地址:    http://www.stmicroelectronics.co ...

  2. CommandLineRunner and ApplicationRunner

    1. Run spring boot as a standalone application (non-web) <?xml version="1.0" encoding=& ...

  3. ES6指北【1】——let、const

    1.如何学习ES6 1.1 js的学习顺序 ES5 -> ES6 -> ES7 -> ES8 以此类推 ES5没学好就别想学好ES6 1.2 边学边用 学了就要用 2.变量声明的方式 ...

  4. java实现数据库之间批量插入数据

    package comnf147Package; import java.sql.*; public class DateMigrationLagou { //连接SQLite private Con ...

  5. Golang协程实现流量统计系统(1)

    # 学习内容: # 学习目标: 学习Golang的基础开发 常用的Golang编程技艺 精巧省力的Go Lib 协程的真实应用实践 与其他语言对比着学 协程并发模型的深度应用 Growth hacki ...

  6. 黑马lavarel教程---7、文件上传

    黑马lavarel教程---7.文件上传 一.总结 一句话总结: 在laravel里面实现文件的上传是很简单的,压根不用引入第三方的类库,作者把上传作为一个简单的http请求看待的. 1.在lavar ...

  7. openssl-1.0.1u静态库编译

    不管Windows还是linux都是需要安装好perl环境的 Windows步骤 1.解压openssl-1.0.1u.tar.gz 2.使用Vs2005命令行工具进入解压后的目录 3.执行如下命令 ...

  8. @RequestHeader和@CookieValue的使用

    /** * 了解: * * @CookieValue: 映射一个 Cookie 值. 属性同 @RequestParam */ @RequestMapping("/testCookieVal ...

  9. 使用KFold进行训练集和验证集的拆分,使用准确率和召回率来挑选合适的阈值(threshold) 1.KFold(进行交叉验证) 2.np.logical_and(两bool数组都是正即为正) 3.np.logical_not(bool数组为正即为反,为反即为正)

    ---恢复内容开始--- 1. k_fold = KFold(n_split, shuffle) 构造KFold的索引切割器 k_fold.split(indices) 对索引进行切割. 参数说明:n ...

  10. Java常见排序和编程算法

    快速排序算法 快速排序是由东尼·霍尔所发展的一种排序算法.在平均状况下,排序 n 个项目要Ο(n log n)次比较.在最坏状况下则需要Ο(n2)次比 较,但这种状况并不常见.事实上,快速排序通常明显 ...