標籤:automapper object to object ef dto
最近在做gxpt(高校平台的項目),前台架構用的是MVC,後台用的是EF+WCF。怎麼突然說出來感覺很高大上的樣子。呵呵!但是在寫代碼的時候就發現一個問題。就是在EF中的實體(Model)跟前台需要的實體(DTO資料轉送對象)是不一樣的,所以就需要轉換一下。一開始也沒多想,可能是被做項目的熱情沖昏了頭腦,寫多少代碼都不覺得類,所以每當需要轉換的時候就一個一個的寫!給大家看一個例子!
<span style="font-size:18px;">namespace testautomapper{ //學生源實體類 public class studentSource { public string name { get; set; } public int age {get;set;} public string sex { get; set; } }}</span>
<span style="font-size:18px;">namespace testautomapper{ //學生目標實體類 public class studentPurpost { public string name { get; set; } public string age { get; set; } public string sex { get; set; } }}</span>
<span style="font-size:18px;"><span style="font-size:18px;">namespace testautomapper{ class Program { static void Main(string[] args) { //要被轉化的實體 這裡類比的是EF中的實體 studentSource sSource = new studentSource { name = "張宏傑", age = 23, sex = "男" }; //類比前台要求的實體, 轉換後的實體! studentPurpost sPurpost = new studentPurpost(); sPurpost.age = sSource.age.ToString(); ; sPurpost.name = sSource.name; sPurpost.sex = sSource.sex; Console.WriteLine(sPurpost.name + sPurpost.sex + sPurpost.age); } }}</span></span>
可是都是這樣一點一點的轉換的,如果那個實體有幾十個屬性的話,哦,my god ;簡直不敢想象。如果是集合的話,那莫還要寫一個迴圈。真的好麻煩!
後來寫著寫著,就感覺煩了,這樣子太浪費時間了,就沒有什麼好的方法嗎!答案顯然是肯定的,好方法還真的有,答案就是AutoMapper。
什麼是AutoMapper呢?
AutoMapper 是什麼呢?Object-ObjectMapping工具,一個對象轉換為另一個對象的工具!做一個比喻吧,如果在一個程式中,把這個程式中比作一個家庭的話,EF就是爸爸,那麼AutoMapper就是媽媽,而DTO就是孩子!媽媽負責協調爸爸和兒子之間的關係。賺錢養家的事情就要交給爸爸去做!
EntityFramework(父親)、AutoMapper(母親)和DTO(孩子)你我都知道的官方定義:
- EntityFramework:是微軟以 ADO.NET 為基礎所發展出來的對象關係對應 (O/R Mapping) 解決方案。
- AutoMapper:Object-Object Mapping工具。
- DTO:資料轉送對象(Data Transfer Object)。
EntityFramework的定義中有“ORM“關鍵字,那ORM又是什嗎?
ORM:對象關係映射(Object/Relation Mapping),是隨著物件導向的軟體開發方法發展而產生的。物件導向的開發方法是當今企業級應用開發環境中的主流開發方法,關聯式資料庫是企業級應用環境中永久存放資料的主流資料存放區系統。對象和關係資料是業務實體的兩種表現形式,業務實體在記憶體中表現為對象,在資料庫中表現為關係資料。記憶體中的對象之間存在關聯和繼承關係,而在資料庫中,關係資料無法直接表達多對多關聯和繼承關係。 --百度百科
概念清楚了就好辦了,我們再來分析下,從上面定義可以看出:AutoMapper是Object-Object映射工具,EntityFramework是一種ORM架構,DTO是資料轉送對象(Data Transfer Object),請注意這三個定義中都包含對象(Object)關鍵字,毫無疑問,AutoMapper所做的工作就是ORM中的“O”和DTO中的“O”之間的映射轉換。
那麼我們該如何去應用它呢?
在應用它之前我們先要引用它。點擊工具下的庫封裝管理員,選擇程式包管理主控台!然後輸入Install-PackageAutoMapper。 然後在引入AutoMapper;就可以放心的使用來了!
還是上邊的那個例子,studentSource實體轉換為studentPurpost 實體!
<span style="font-size:18px;"><span style="font-size:18px;">namespace testautomapper{ class Program { static void Main(string[] args) { //建立映射規則 Mapper.CreateMap<studentSource, studentPurpost>(); //建立一個實體 studentSource sSource = new studentSource { name = "張宏傑", age = 23, sex = "男" }; //進行轉換 var sPurpost = Mapper.Map<studentPurpost>(sSource); Console.WriteLine(sPurpost.name + sPurpost.sex + sPurpost.age); } }</span>}</span>
這樣我們就可以將一個實體轉換為另一個實體了!現在的情況是兩個實體的子屬性欄位一樣,所以我們就可以轉換了!當然這樣的簡單的實體的集合也是可以進行轉換的!
<span style="font-size:18px;"><span style="font-size:18px;">namespace testautomapper{ class Program { static void Main(string[] args) { //建立一個轉換關係規則 Mapper.CreateMap<studentSource, studentPurpost>(); //建立一個實體集合 List<studentSource> list = new List<studentSource>(); studentSource s = new studentSource { name = "hongjie", age = 13, sex = "nan" }; list.Add(s); //進行轉換 List<studentPurpost> sPurpostList = Mapper.Map<List<studentSource>, List<studentPurpost>>(list); Console.WriteLine(sPurpostList[0].age + sPurpostList[0].name + sPurpostList[0].sex); } }}</span></span>
怎麼樣,感覺是不是很爽。這樣做省去了我們的很多麻煩事,讓我們可以專心的對待我們的商務邏輯了,在也不用寫這種沒用的代碼浪費生命了!
這就是automapper的簡單應用,如果還想繼續深入的瞭解AutoMapper,請繼續關注我的部落格,本人還會陸續推出其他文章!
無名小卒AutoMapper的大顯神威