创建一个MapperConfiguration并通过构造函数初始化配置:

  1. var config = new MapperConfiguration(cfg => {
  2. cfg.CreateMap<Foo, Bar>();
  3. cfg.AddProfile<FooProfile>();
  4. });

Profile


通过Profile来组织各种映射是一个不错的方法。

  1. public class OrganizationProfile : Profile
  2. {
  3. public OrganizationProfile()
  4. {
  5. CreateMap<Foo, FooDto>();
  6. // Use CreateMap... Etc.. here (Profile methods are the same as configuration methods)
  7. }
  8. }
  9. // How it was done in 4.x - as of 5.0 this is obsolete:
  10. // public class OrganizationProfile : Profile
  11. // {
  12. // protected override void Configure()
  13. // {
  14. // CreateMap<Foo, FooDto>();
  15. // }
  16. // }

程序集扫描

  1. var config = new MapperConfiguration(cfg => {
  2. cfg.AddMaps(myAssembly);
  3. });
  4. var configuration = new MapperConfiguration(cfg => cfg.AddMaps(myAssembly));
  5. // Can also use assembly names:
  6. var configuration = new MapperConfiguration(cfg =>
  7. cfg.AddMaps(new [] {
  8. "Foo.UI",
  9. "Foo.Core"
  10. });
  11. );
  12. // Or marker types for assemblies:
  13. var configuration = new MapperConfiguration(cfg =>
  14. cfg.AddMaps(new [] {
  15. typeof(HomeController),
  16. typeof(Entity)
  17. });
  18. );

AutoMapper 会扫描指定程序集中继承Profile的类。

名称约定

  1. var configuration = new MapperConfiguration(cfg => {
  2. cfg.SourceMemberNamingConvention = new LowerUnderscoreNamingConvention();
  3. cfg.DestinationMemberNamingConvention = new PascalCaseNamingConvention();
  4. });
  5. public class OrganizationProfile : Profile
  6. {
  7. public OrganizationProfile()
  8. {
  9. SourceMemberNamingConvention = new LowerUnderscoreNamingConvention();
  10. DestinationMemberNamingConvention = new PascalCaseNamingConvention();
  11. //Put your CreateMap... Etc.. here
  12. }
  13. }

更换字符

  1. public class Source
  2. {
  3. public int Value { get; set; }
  4. public int Ävíator { get; set; }
  5. public int SubAirlinaFlight { get; set; }
  6. }
  7. public class Destination
  8. {
  9. public int Value { get; set; }
  10. public int Aviator { get; set; }
  11. public int SubAirlineFlight { get; set; }
  12. }
  13. var configuration = new MapperConfiguration(c =>
  14. {
  15. c.ReplaceMemberName("Ä", "A");
  16. c.ReplaceMemberName("í", "i");
  17. c.ReplaceMemberName("Airlina", "Airline");
  18. });

识别前缀/后缀

  1. public class Source {
  2. public int frmValue { get; set; }
  3. public int frmValue2 { get; set; }
  4. }
  5. public class Dest {
  6. public int Value { get; set; }
  7. public int Value2 { get; set; }
  8. }
  9. var configuration = new MapperConfiguration(cfg => {
  10. cfg.RecognizePrefixes("frm");
  11. cfg.CreateMap<Source, Dest>();
  12. });
  13. configuration.AssertConfigurationIsValid();

属性过滤

  1. var configuration = new MapperConfiguration(cfg =>
  2. {
  3. // don't map any fields
  4. cfg.ShouldMapField = fi => false;
  5. // map properties with a public or private getter
  6. cfg.ShouldMapProperty = pi =>
  7. pi.GetMethod != null && (pi.GetMethod.IsPublic || pi.GetMethod.IsPrivate);
  8. });

直接编译

由于表达式编译可能会占用一些资源,因此AutoMapper会在第一个地图上延迟编译类型地图计划。但是,这种行为并不总是令人满意的,因此您可以告诉AutoMapper直接编译其映射

  1. var configuration = new MapperConfiguration(cfg => {});
  2. configuration.CompileMappings();