程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> AutoMapper搬運工之配置,automapper搬運工

AutoMapper搬運工之配置,automapper搬運工

編輯:C#入門知識

AutoMapper搬運工之配置,automapper搬運工


回顧

前幾篇搬運了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已經為你想好了,不過顯然這裡其實也可以自己單獨寫一個方法來處理。

 

配置文件 (Profile)

如果熟悉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中的作用,教?

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,理解為代碼生成器也可以……
 


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved