天天看點

AutoMapper中的Map和DynamicMap——高手注重細節,思考和總結

近日在做項目的時候,遇到了個怪問題,關于AutoMapper的細節問題,也是不為一般人所關注的。

本人研究AutoMapper也沒有多長時間,而且研究的過程中也寫了關于AutoMapper的系列基礎教程,但是畢竟AutoMapper是個開源項目,并不是一個簡單的系列教程就能解釋的清楚的,隻能解釋個大概,項目實戰的時候,遇到的細節問題還得自己私下裡再次研究、總結。

首先,我要說明的是,這篇部落格的寫作順序是按事情發展的順序來寫的,也就是說,在我想寫這篇部落格時,問題的根本原因還沒找到,但是此時,我回過頭來,再來看這個過程中每個問題的解決思路,我想,此時這個細節的問題已經清楚了,也來分享一下。

先來讓大家看看我的AutoMapper的大緻配置過程:

先建立實體類對應的AutoMapper配置類,命名規範是EntityName(實體類名)+Profile,比如PersonProfile,ProvincePerfile等。

AutoMapper中的Map和DynamicMap——高手注重細節,思考和總結
AutoMapper中的Map和DynamicMap——高手注重細節,思考和總結

再建立一個靜态類,取名AutoMapperConfig,然後在他的靜态方法中初始化Mapper,并添加所有的配置類,這裡我還添加了其他配置類。

AutoMapper中的Map和DynamicMap——高手注重細節,思考和總結
AutoMapper中的Map和DynamicMap——高手注重細節,思考和總結

最後,在項目啟動的時候(ASP.Net程式在.asax檔案中的Application_Start方法)調用AutoMapperWebConfig.Configure();就可以了。

這一切都感覺這麼順利,但是往往越是順利的時候,也意味着不順快來了。接下來,類似下面截圖中的錯誤向我狂轟亂炸。

當我使用在應用層使用Mapper.Map()方法将實體類映射為Dto類時,報錯如下:

AutoMapper中的Map和DynamicMap——高手注重細節,思考和總結

很明顯這是AutoMapper映射錯誤。

ta的解決方案是,如圖

AutoMapper中的Map和DynamicMap——高手注重細節,思考和總結

看到這裡,我很高興,趕緊改了一下自己的代碼,發現果然成功了!但是該部落客并沒有給出個是以然來。

AutoMapper中的Map和DynamicMap——高手注重細節,思考和總結

但是,我不服氣,我之前已經建立了兩個類之間的映射啊,為啥Mapper.Map()方法不行,我就納悶了,我非得搞清楚這兩者之間的關系不可。

我尋思着,就字面意思來看,一個是“映射”,一個是“動态映射”,會有啥差別呢?

AutoMapper中的Map和DynamicMap——高手注重細節,思考和總結

這裡說,DynamicMap在編譯時你不知道源類型的情況下使用,那麼,相應地,Map就是在編譯時知道源類型的情況下使用。簡單的這一句解釋并不能讓接觸AutoMapper時間不長的人有所啟示。

而問題就出在,我之前已經建立了映射,是以在編譯時應該可以确定源類型的,更何況我這兩個類都很簡單,不可能是因為資料類型不一緻造成的映射失敗啊!代碼如下:

AutoMapper中的Map和DynamicMap——高手注重細節,思考和總結
AutoMapper中的Map和DynamicMap——高手注重細節,思考和總結
AutoMapper中的Map和DynamicMap——高手注重細節,思考和總結
AutoMapper中的Map和DynamicMap——高手注重細節,思考和總結
AutoMapper中的Map和DynamicMap——高手注重細節,思考和總結

該回答者給我的答案如上,他猜想我在每個實體類對應的Profile檔案中,應該直接使用CreateMap,而不是在Mapper.Initialize中使用CreateMap。按照他的提示,我修改了代碼,以後再也沒有出現錯誤。

=============該總結了================

現在再次回頭看看這個問題,完全是了然于胸的感覺。因為我在AutoMapperWebconfig靜态類的靜态方法中已經進行了Mapper.Initialize(),這是AutoMapper的初始化,而在每個實體類對應的Profile類中又使用了一次。嘗試着去想一想,第一次将所有的文配置類都初始化到Mapper(暫且先将它了解成一個容器)中,第二次調用Mapper.Initialize()可能會把之前的内容都擦除掉,是以使用Mapper.Map的時候會報錯就可以想明白了,而使用DynamicMap,之前在哪裡看到過DynamicMap就想當于先CreateMap,再Map,是以,我們之前的配置就可有可無,無關緊要了,因為DynamicMap會把之前的配置擦除掉,是以上面截圖中的映射成功了。而至于其他配置類沒有出現該錯誤,該回答者給的答案是”這可能是個意外!“。在這次坎坷曲折的解決問題的過程中,還是學到了很多東西的。在這裡,我們也很顯然,可以看出部落格園那位園友使用DynamicMap成功後而沒給出為什麼,十有八九也是我這個問題了。

本文轉自tkbSimplest部落格園部落格,原文連結:http://www.cnblogs.com/farb/p/4995431.html,如需轉載請自行聯系原作者

繼續閱讀