經過構造函數建立並初始化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 => { /* 從新配置 */ });
不該在生產代碼中使用重置。它的意義在於支持測試場景。