配置(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 => { /* 重新配置 */ });

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

最新文章

  1. PHP data
  2. jquery 无缝滚动 jquery.kxbdmarquee
  3. 【linux】之相关命令
  4. 【C语言入门教程】4.6 指针 和 数组
  5. The Dataflow Model 论文
  6. Kerbose
  7. CUDA编程-(2)其实写个矩阵相乘并不是那么难
  8. 【HDOJ】2444 The Accomodation of Students
  9. c++,static 静态成员变量 / 静态成员函数
  10. FreeRTOS——队列管理
  11. SetConsoleTitle 函数--设置控制台窗口标题
  12. EntityFramework Code-First—领域类配置之DataAnnotations
  13. mysql之数据分区
  14. 亚像素Sub Pixel
  15. 一些js在线引用文档
  16. ibatis.net:惯用法
  17. hbuilder 打包app简易教程
  18. 关于在Mac上安装模拟器的坑比~~~~~
  19. all any some
  20. C# 代码操作XML(增、删、改)

热门文章

  1. JS框架_(JQuery.js)圆形多选菜单选项
  2. html5 canvas简易时钟
  3. JavaScript_AMD规范
  4. 1.4 Navicat Mybatis 占坑
  5. CAN波特率设置
  6. pandas分组运算(groupby)
  7. 函数对象的apply()和call()方法
  8. linu基础命令1
  9. 英特尔&#174; Open Image Denoise 库有助于节省时间,提高质量
  10. cocos2dx基础篇(4) 标签CCLabel