標籤:
1. 事件的背景
初始AutoMapper是在做成績管理系統1.0的時候,那個時候因為系統採用了WCF+MVC+easyUI+EF的架構,那麼我們在實現B層與WCF層之間的實體轉換的時候就需要藉助於某種方法(用純程式碼實現)或者某種工具實現,我採取的是後者,因為每當遇到一個問題的時候,我總是覺得有比寫純程式碼更加簡潔的方法。
那個時候只是上網查個例子就用,別的也沒有想那麼多。直到今天我的一個組內的夥伴讓我調試的一個錯誤,我才真正意識到自己的是需要深入研究的。
初接手一個項目的時候,對於架構的以及業務的分析不是那麼的清晰的條件下,大多數的人採用的是按實體劃分而不是業務劃分,估計就有人想省事,那就是採用把Model層的各個實體直接定義到資料契約或者我們說的提供給ui供顯示的使用的viewModel,但是這樣的結果出現偶然性,如果沒有主外鍵的關係或者其它的關係複雜的方法,那麼直接引入Automapper什麼時候估計也不會報錯,但是如果你的有複雜的主外鍵關係或者其它的一些複雜的方法,那麼直接引入而不加配置的話,可能會出現很多的錯誤,比如出現“miss type map configuration or unsurported”等等。
此時經過尋找將供UI顯示的實體中的顯示下面的存在複雜的主外鍵關係,注釋掉後發現了,困擾的問題得以解決了。下面我們來認識一下Automapper吧。
2. Automapper知多少? ? 什麼是Automapper
在學習EF的時候我們知道了ORM(Object Relational Mapping)映射,是一種對象關係的映射,對象-關係映射(ORM)系統一般以中介軟體的形式存在,主要實現程式對象到關聯式資料庫資料的映射。
而Automapper是一種實體轉換關係的模型,AutoMapper是一個.NET的對象映射工具。主要作用是進行領域對象與貧血模型(DTO)之間的轉換、資料庫查詢結果映射至實體物件。
? 什麼是DTO? 概念
資料轉送對象(DTO)(DataTransfer Object),是一種設計模式之間傳輸資料的軟體應用系統。資料轉送目標往往是Data Access Objects從而從資料庫中檢索資料。資料轉送對象與資料互動對象或Data Access Objects之間的差異是一個以不具有任何行為除了儲存和檢索的資料(訪問和存取器)。
為什麼用?
引用別人的話說“表現層與應用程式層之間是通過資料轉送對象(DTO)進行互動的,資料轉送對象是沒有行為的POCO(Plain Old CLR Object)對象,它的目的只是為了對領域對象進行資料封裝,實現層與層之間的資料傳遞。為何不能直接將領域對象用於資料傳遞?因為領域對象更注重領域,而DTO更注重資料。不僅如此,由於“富領域模型”的特點,這樣做會直接將領域對象的行為暴露給表現層。
需要瞭解的是,資料轉送對象DTO本身並不是業務對象。資料轉送對象是根據UI的需求進行設計的,而不是根據領域對象進行設計的。比如,Customer領域對象可能會包含一些諸如FirstName, LastName, Email, Address等資訊。但如果UI上不打算顯示Address的資訊,那麼CustomerDTO中也無需包含這個 Address的資料”。
? 什麼是領域對象? 概念
領域模型是對領域內的概念類或現實世界中對象的可視化表示。又稱概念性模型、領域物件模型、分析物件模型。它專註於分析問題領域本身,發掘重要的業務領域概念,並建立業務領域概念之間的關係。
領域模型就是物件導向的,物件導向的一個很重要的點就是:“把事情交給最適合的類去做”,即:“你得在一個個領域類之間跳轉,才能找出他們如何互動”。在我們的系統中Model(EF中的實體)就是領域模型對象。領域對象主要是面對業務的,我們是通過業務來定義Model的。
? 怎麼用?
這個網上的資料很豐富,大家可以上網尋找,對於一件事情,別人告訴你有這個事情,剩下的事情就是自己去學,給大家推薦一個部落格
http://www.cnblogs.com/smileberry/p/3838143.html。
3. 小結
我們定義的領域模型對象例如Model面向業務,而DTO(在我們的系統中是資料契約或者說是viewModel是供ui使用的)是面向介面UI,所以我們應該根據UI的需求來定義。利用DTO可以使表現層與Model解耦解除,表現層(也就是顯示的介面)不需要引用Model,這樣的好處是即使我們的模型或者model發生改變,而介面無需改變的情況下,我們可以直接修改model而無需更改介面的顯示,這樣是實現瞭解耦合。
AutoMapper知多少?