前幾篇搬運了AutoMapper的基本用法,自定義映射,相信有看的同學已經會使用AutoMapper這個強大的Mapping工具了。不過細心的你是否還記得前幾篇中有提到Map的創建並非是每次都需要Create,那麼AutoMapper對於這些如果管理呢?這篇我們就要來看看AutoMapper的配置。
AutoMapper提供一個初始化函數(Mapper.Initialize),可以在程序初始化時調用(Web應用程序可以在Global.asax裡寫),進行統一的配置初始化。前幾個章節的CreateMap就可以統一寫到此處,如下:
1 Mapper.Initialize(cfg => { 2 Mapper.CreateMap<CalendarEvent, CalendarEventForm>() 3 .ForMember(dest => dest.EventDate, opt => opt.MapFrom(src => src.Date.Date)) 4 .ForMember(dest => dest.EventHour, opt => opt.MapFrom(src => src.Date.Hour)) 5 .ForMember(dest => dest.EventMinute, opt => opt.MapFrom(src => src.Date.Minute)); 6 });
OK,是不是很方便,那麼問題來了,cfg是個什麼東西?這裡根本沒用嘛?
當然不是這樣的,Config裡的配置還有很多的,只不過這篇我們就講如何統一處理CreateMap,其他配置可以自己敲代碼看一下,如果有問題,也可以留言交流下。後面的章節裡會逐個講。
那麼本篇就結束了麼?沒有,細心的你會不會覺得在Global.asax裡寫這麼多CreateMap嚴重影響了代碼的美觀和可維護性。如果寫到外面去處理那不是更方便。當然,強大的AutoMapper已經為你想好了,不過顯然這裡其實也可以自己單獨寫一個方法來處理。
如果熟悉windows的網絡配置netsh wlan profile的同學肯定對Profile的概念不陌生,簡單的說就是按照AutoMapper的規范單獨的制定了一個格式的文件,在該文件中可以預定於一些AutoMapper的配置,用於統一分門別類的管理好我們在使用AutoMapper時需要的配置。
一個標准的AutoMapper配置文件是這樣子的:
1 public class OrganizationProfile : Profile 2 { 3 protected override void Configure() 4 { 5 //將CreateMap放到此處 6 } 7 8 //配置的名稱,默認可以定義為當前的類名 9 public override string ProfileName 10 { 11 get { return this.GetType().Name; } 12 } 13 }
定義好了配置文件,只需要在AutoMapper初始化時添加即可:
1 Mapper.Initialize(cfg => { 2 3 cfg.AddProfile<OrganizationProfile>(); 4 });
如果你覺得配置文件就只有這麼簡單的功能的話,那麼就錯了,Profile還有更強大的功能,那就是每個Profile裡創建的Map可以單獨配置Mapping的一些規則,例如:
public class OrganizationProfile : Profile { protected override void Configure() { //Mapper.CreateMap寫到此處... Etc.. here SourceMemberNamingConvention = new LowerUnderscoreNamingConvention(); DestinationMemberNamingConvention = new PascalCaseNamingConvention(); } }
SourceMemberNamingConvention指的是源對象的屬性匹配規則,即默認的是propertyName -> propertyName的轉換,這裡設置了一個帶下劃線的匹配LowerUnderscoreNamingConvention, 即property_name -> PropertyName
DestinationMemberNamingConvention指的是目標對象的屬性匹配規則,這裡的PascalCaseNamingConvention指的是按照Pascal駝峰命名規則來處理。這兩個處理Convention是AutoMapper已經提供的,如果需要自定義更強大的Convention那麼,請期待下節:《AutoMapper搬運工之自定義轉換規則》
以上文章搬運自:https://github.com/AutoMapper/AutoMapper/wiki/Configuration
另外參考文章:http://consultingblogs.emc.com/owainwragg/archive/2010/12/15/automapper-profiles.aspx
如有不對的地方請指教,如果覺得好,請點推薦,感激不盡~
AutoMapper?舉個最簡單的例子。
比如在ORM中,與數據庫交互用的Model模型是具有很多屬性變量方法神馬的。而當我們與其它系統(或系統中的其它結構)進行數據交互時,出於耦合性考慮或者安全性考慮或者性能考慮(總之就是各種考慮),我們不希望直接將這個Model模型傳遞給它們,這時我們會創建一個貧血模型來保存數據並傳遞。神馬是貧血模型?貧血模型(DTO,Data Transfer Object)就是說只包含屬性神馬的,只能保存必須的數據,木有其它任何的多余的方法數據什麼的,專門用於數據傳遞用的類型對象。在這個創建的過程中,如果我們手動來進行,就會看到這樣的代碼:
B b=new B();
b.XXX1=a.XXX1;
b.XXX2=a.XXX2;
...
...
...
return b;
此時,AutoMapper可以發揮的作用就是根據A的模型和B的模型中的定義,自動將A模型映射為一個全新的B模型。從而避免寫這樣又臭又長又無聊的代碼。SO,理解為代碼生成器也可以……