【學習紀錄】AutoMapper

AutoMapper是一個可以自動轉換class資料的套件,本篇文章描述使用AutoMapper的感想與一些個人抱怨

這篇算有點抱怨文

介紹

AutoMapper是一個自動可以自動轉換物件的套件
假設有兩個class的屬性大部分名字與型態一樣,需要把A Class的資料轉到B Class
一般作法大概是
var b=new B{
property1=A.property1,
property2=A.property2,
property3=A.property3,
//...
};
但如果是使用AutoMapper,轉換上的對應要是名稱型態相同的話,可以不用一個個寫

抱怨

AutoMapper的相關文章可以google到很多,但很多網頁的程式碼可能不能用或者不建議用
早期的用法是使用static class,但5.x的版本變成建議使用實體的method做處理,這改變有其考量
網路上一些好心人士寫的教學文章是用static居多,好吧,這種狀況我能接受
但是連官網的wiki網頁,也大多使用static的作法,變成要學較適當的做法就很辛苦
官網的網頁在描述用法上,我是覺得寫得不太好懂
最後我就網頁都掃過,能理解就理解,不能理解就放棄不管了...

我的用法

新版本的基本用法是
1.先建立一個MapperConfiguration的實體
2.用MapperConfiguration來建立一個IMapper的實體
3.用IMapper的實體來轉換class的資料
有時兩個class間的資料轉換需要一些特殊邏輯,這可在MapperConfiguration初始化時設定
一種做法是使用Profile設定對應邏輯,在初始化MapperConfiguration的時候直接使用Profile
我的用法是一個功能(或一個service)會建一個Profile做專門的對應設定
把產生的MapperConfiguration的實體用單一實體的方式注入
注入設定而不是注入IMapper的原因是「ProjectTo的使用上不能用IMapper的樣子(我只看到使用設定的寫法)」
我通常是使用ProjectTo把Entity Class的資料轉到View用的Model
我不會把View Model的資料自動轉到Entity Class去(怕自動轉出錯)
另外要特別注意的是,當執行發生例外的時候,Message顯示的內容可能是英文而且還帶換行
如果把Message內容直接傳到前端的js變數裡可能會有問題

結論

AutoMapper是個學習上有點困難但某些狀況很方便的套件