配置(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. Java基础__Java中异常处理那些事

    一.Exception 类的层次 所有的异常类是从 java.lang.Exception 类继承的子类. Exception 类是 Throwable 类的子类.除了Exception类外,Thro ...

  2. es6 的数组的方法

    es6 数组的拓展 数组的类 Array 数组的定义: 1. var arr=[]; 2. var arr=new Array(3) // 3 代表有三个元素 arr[0]=12; arr[1]=24 ...

  3. tps抖动

    https://blog.csdn.net/lzqinfen/article/details/46820673 tps抖动厉害的原因?突然增加成倍的用户,如果性能表现良好,TPS应该成倍增加,响应时间 ...

  4. leetcode-easy-trees-108. Convert Sorted Array to Binary Search Tree

    mycode  81.75 # Definition for a binary tree node. # class TreeNode(object): # def __init__(self, x) ...

  5. python - readline 模块

    转载:https://www.cnblogs.com/fireflow/p/4841413.html readline模块定义了一系列函数用来读写Python解释器中历史命令,并提供自动补全命令功能. ...

  6. 三步解决IDEA系列开发工具 RubyMine、IntelliJ IDEA 卡顿问题

    近日有小伙伴跟我反映说自己的开发工具很卡,有没有什么解决方案?答案是当然有啦!接下来看看怎么设置! 1.打开RubyMine,或IDEA,上边工具栏选择Help,下拉选择Edit Custom VM ...

  7. 使用apicloud开发移动端APP,IOS list页面滚动卡顿解决记录

    给内容容器添加样式:-webkit-overflow-scrolling:touch; -webkit-overflow-scrolling:属性控制元素在移动设备上是否使用滚动回弹效果. auto: ...

  8. Web02_HTML&CSS

    HTML 表单标签属性介绍 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> ...

  9. docker容器和宿主机之间复制文件

    https://blog.csdn.net/u012416928/article/details/55049063 https://blog.csdn.net/u011596455/article/d ...

  10. C++统计程序运行时间代码片段

    因为经常需要统计代码的运行时间,所以计时功能就显得很重要, 记录一下现在喜欢用的计时方式,供日后查阅. 1.下面是计时主函数, bool TimeStaticMine(int id,const cha ...