17.AutoMapper 之配置(Configuration)

 

配置(Configuration)

經過構造函數建立並初始化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 成員。

Configuration 編譯

由於表達式編譯可能會佔用大量資源,因此AutoMapper延遲編譯類型映射,並計劃在第一次執行映射的時候編譯。可是,這種行爲並不能總讓人滿意,因此你也能夠告訴AutoMapper直接編譯映射:

Mapper.Initialize(cfg => {}); Mapper.Configuration.CompileMappings(); 

對於幾百個映射,這可能須要幾秒鐘。

重置靜態映射配置

靜態Mapper.Initialize意味着只被調用一次。重置的靜態映射配置(例如,在測試開始時):

Mapper.Reset();

Mapper.Initialize(cfg => { /* 從新配置 */ }); 

不該在生產代碼中使用重置。它的意義在於支持測試場景。

相關文章
相關標籤/搜索