在上一篇我們介紹了AutoMapper的設定和用法,使用起來肯定比自己手動做左邊倒到右邊還要簡單。
不過AutoMapper也不是沒有它自己的問題,最麻煩的地方在於設定Entity和Class之間的對應。這一篇要探討的就是,如何透過框架來減少這方面的設定。
框架思路
我們先來思考一下我們會如何達到簡化設定對應邏輯,然後在開始開發。
首先,其實AutoMapper本身有所謂的Profile,可以透過Profile來設定Entity和ViewModel之間的對應。不過我個人比較傾向於Entity和ViewModel的對應邏輯是能夠簡單看到並且是在一起,換句話說,如果能夠在ViewModel定義好和Entity的對應關係不是很好,因為只要一找到ViewModel,馬上就知道它和Entity的關係。
有了這個概念,我們就可以來看一下我們如何透過Interface來達到這個效果。
Interface的定義
我們要提供兩種定義的方式:
IMapFrom<T>
- T表示這個ViewModel對應的EntityIHaveCustomMapping
- 表示這個ViewModel要自己對應Entity和設定自己的邏輯
因此看起來會是:
.png)
然後實際的C#程式碼是:
使用兩個interface的差異
使用IMapFrom<T>
我們先看一下上一篇我們IndexViewModel
本來的用法:
如果改用成我們的interface,會變成:
使用IHaveCustomMapping
這個是假設有特殊的對應邏輯才在呼叫,使用上會是:
可以看到,AutoMapper的IConfiguration
會被傳進來,這時候就可以手動設定對應邏輯。
到這邊為止,我們interface的定義和使用就完成了,不過接下來我們還需要讓這兩個interface實際有作用,要不然是沒有效果。
在系統啟動的時候註冊AutoMapper對應
當我們用了interface把這些ViewModel的對應都定義好了之後,我們希望在系統啟動了之後,讀出所有設定過這兩種interface的ViewModel,並且作出對應的AutoMapper設定。
我們首先寫好使用這兩個interface的邏輯:
顯示取得所有實作這兩個interface的type:
在來針對兩個不同的interface呼叫不同的mapping邏輯:
Task Module
在上面的部分,如果注意看的話,AutoMapperConfig : IRunAtStartup
。而IRunAtStartup
其實屬於我們框架的Task系統。以IRunAtStartUp
來說,表示實作這個interface的Class將會在系統啟動的時候執行。
因此我們先設定這個Task的Autofac Module:
然後在Global.asax的地方註冊這個Module:
最後,因為這個IRunAtStartup
屬於系統啟動的時候執行,因此在同樣global.asax
裡面的Application_Start
,我們就會:
結語
在這一篇我們把AutoMapper的對應設定邏輯利用2種interface把它抽到了和ViewModel一起定義。這樣的好處是我們只要看到ViewModel,就會知道他和那些Entity有對應關係。
希望透過這一篇,讓在使用AutoMapper的時候能夠更簡單,並且更容易使用。
在下一篇,我們來看如何透過Unit of Work和Repository Pattern把DB的溝通抽出來。