经过构造函数建立并初始化MapperConfiguration
实例:javascript
config = new MapperConfiguration(cfg => { cfg.CreateMap<Foo, Bar>(); cfg.AddProfile<FooProfile>(); });
MapperConfiguration
能够静态存储在静态字段或者依赖注入容器中。一经建立就没法更改/修改。css
或者,您可使用静态Mapper实例初始化AutoMapper:java
Mapper.Initialize(cfg => { cfg.CreateMap<Foo, Bar>(); cfg.AddProfile<FooProfile>(); });
使用配置文件来组织你的映射配置是一个很好的方式。建立继承自Profile的类并把配置写在构造函数中:app
// 这种方式从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版本中移除。ide
Configuration 内部的配置文件仅适用于配置文件内部的映射。Configuration 应用于根配置,则适用于全部被建立的映射。函数
配置文件有多种方式能够直接添加到主映射配置中:测试
cfg.AddProfile<OrganizationProfile>(); cfg.AddProfile(new OrganizationProfile());
or by automatically scanning for profiles:ui
// 在程序集中扫描全部配置 //使用实例的方式: 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的类添加到配置中。spa
你能够设置源和目标的命名约定code
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 成员。
由于表达式编译可能会占用大量资源,因此AutoMapper延迟编译类型映射,并计划在第一次执行映射的时候编译。可是,这种行为并不能总让人满意,因此你也能够告诉AutoMapper直接编译映射:
Mapper.Initialize(cfg => {}); Mapper.Configuration.CompileMappings();
对于几百个映射,这可能须要几秒钟。
静态Mapper.Initialize意味着只被调用一次。重置的静态映射配置(例如,在测试开始时):
Mapper.Reset();
Mapper.Initialize(cfg => { /* 从新配置 */ });
不该在生产代码中使用重置。它的意义在于支持测试场景。