2013年4月10日 星期三

AutoMapper 的設定 (Configuration)

上一篇「使用 AutoMapper 處理類別之間的對映轉換」像各位說明在系統中可以使用 AutoMapper 來處理類別之間的轉換,例如:Entity Model to DTO, DTO to Entity Model, Entity Model to ViewModel, ViewModel to Entity Model … etc.

應該有人會覺得每次要使用 AutoMapper 處理類別轉換的時候總是要先建立類別轉換的設定,然後再執行轉換,如果同樣的類別轉換設定會在不同地方出現時,豈不是每次都要重複建立嗎?比如說以下的這個設定:

image

這一篇就跟大家說明如何處理 AutoMapper 的設定。

 


使用 ASP.NET MVC 4 開發與以往 ASP.NET MVC 比較明顯的不同就是原本放在 Global.asax 的一些設定都抽出來,依照作用與類別的不同而放在各自不同的檔案裡,然後這些設定檔案會存放在 App_Start 目錄下,

image

RputeConfig.cs

image

而同樣的,我們可以把在程式中所建立的 AutoMapper 設定給集中在一起,就不用每次要做類別轉換的時候又再去重新建立。

 

首先在 App_Start 目錄加入一個新的類別檔「AutoMapperConfig.cs」

image

接著在 AutoMapperConfig.cs 加入一個靜態 ( static ) 方法,名稱為「Configure」,這個靜態方法的名稱不限定,可以是 Initialize 或其他可比表示這個 AutoMapperConfig 類別的起始方法,

image

在這麼 Configure() 靜態方法中,我們要加入的是 Mapper.Initialize() 方法,

image

在 Mapper.Initialize() 再加入我們建立的 AutoMapper 類別轉換的對映設定,而這邊的對映設定則是要另外建立繼承 AutoMapper.Profile 的類別,

我們要把以下建立的 PR_Categories_SelectAll_Result 與 Category 的對映設定給移到 AutoMapperConfig.cs 中,

image

在 AutoMapperConfig.cs 的檔案中,加入一個型別「SpResultMaoToEntityProfile」繼承 AutoMapper.Profile,並且 override AutoMapper.Profile 的 ProfileName 屬性與 Configure() 方法,ProfileName 就是回傳此 Profile 類別的名稱,而 Configure() 方法內容則是原本我們在 CategoryController.Index Action 內所建立的對映設定,

image

完成 SpResultMaoToEntityProfile 類別之後,再把這個 Profile 加入到 AutoMapperConfig.Configure() 方法中,

image

再來我們到 Global.asax 的 Application_Start() 方法裡加入 AutoMapperConfig.Configure(); 的使用,

image

最後我們回到 CategoryController.Index Action 方法,把原本建立的 CreateMap 設定給註解起來,

image

以上的步驟都完成後,下個中斷點然後執行網站觀察,可以看到下圖的內容是已經完成了兩個類別的對映轉換,

image

專案內有需要使用到 PR_Categories_SelectAll_Result 與 Category 的類別對映轉換設定(Mapper.MapCreate<TSource, TDestination>())就不需要重複地去建立,只需要去建立 AutoMapper.Profile 類別並且加入到 AutoMapperConfig.cs 的 Configure() 靜態方法內的 Mapper.Initialize()。

 

再加入另一個類別轉換對應,一個 Profile 可以有多個 CreateMap,不過會建議是以類別的相關性來做集中管理,例如我將有關 Customer 類別的 CreateMap 集中到另一個新建立的 Profile 當中,

image

AutoMapperCoinfig 的 Configure(),加入新建立的 CustomerSpResultMapToEntityProfile,

image

原來 CustomerController 的  FromStoredProcedure() 與 FromStoredProcedure2() 就簡潔多了,

before

image

after

image

 

將類別對應轉換的建立與設定放在 AutoMapperConfig.cs 裡除了可以省去重複建立的動作外,另一方面也是集中管理,將這些類別轉換對應的設定都集中在一個地方,不要四散在 Controller 或是其他的程式裡,而另一方面也是避免四散各地又重複建立時會出現錯誤的屬性對應。

集中在一起還有一個重點,那就是類別的對應轉換設定實在是一件有些瑣碎的事情,開發人員應該把關注點給放在要注意的地方,而不是這些重複性高的地方,開發人員只要去定義一個兩個類別是如何轉換,而不用每次要做轉換的時候又再一次重複的去把這些怎麼對應轉換的過程給寫出來。

 

以上

1 則留言:

  1. http://blog.kkbruce.net/2015/11/automapper-411-profilename-error.html
    這是早上碰到的,反應給你。因為我是看你的文長大的 XD

    回覆刪除

提醒

千萬不要使用 Google Talk (Hangouts) 或 Facebook 及時通訊與我聯繫、提問,因為會掉訊息甚至我是過了好幾天之後才發現到你曾經傳給我訊息過,請多多使用「詢問與建議」(在左邊,就在左邊),另外比較深入的問題討論,或是有牽涉到你實作程式碼的內容,不適合在留言板裡留言討論,請務必使用「詢問與建議」功能(可以夾帶檔案),謝謝。