配置(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. 安装python及其它

    https://www.liaoxuefeng.com/wiki/1016959663602400/1016959856222624

  2. scala实战学习-尾递归函数

    求 $$ \Sigma\sideset{^b_a}f(x) $$ object sumfunc{ def sum(f: Int => Int)(a: Int)(b:Int): Int = { @ ...

  3. python3 类的属性、方法、封装、继承及小实例

    Python 类 Python中的类提供了面向对象编程的所有基本功能:类的继承机制允许多个基类,派生类可以覆盖基类中的任何方法,方法中可以调用基类中的同名方法. 对象可以包含任意数量和类型的数据. p ...

  4. PHPSESSID的cookie//session_start()

    如果PHP脚本中有: 1 session_start(); 则说明使用了SESSION. SESSION是一种机制,可以在服务器端跨文件暂时保存数据或传递数据,常用于购物车等方面. SESSION只在 ...

  5. springboot+mybatis 使用事务

    一.一些概念 声明式的事务管理是基于AOP的,在springboot中可以通过@Transactional注解的方式获得支持,这种方式的优点是: 1)非侵入式,业务逻辑不受事务管理代码的污染. 2)方 ...

  6. yue

    1. 字节流与二进制文件 1.我的代码 public class Student { private int id; private String name; private int age; pri ...

  7. jQuery file upload 服务端返回数据格式

    Using jQuery File Upload (UI version) with a custom server-side upload handler 正常的返回结果,即上传文件成功 Exten ...

  8. What exactly is the parameter e (event) and why pass it to JavaScript functions?

    What exactly is the parameter e (event) and why pass it to JavaScript functions? 问题 Well, when I lea ...

  9. leetcode-easy-math-13 Roman to Integer

    mycode  97.21% class Solution(object): def romanToInt(self, s): """ :type s: str :rty ...

  10. leetcode886可能的二分法

    class Solution { public: bool possibleBipartition(int N, vector<vector<int>>& dislik ...