標籤:android style class blog code http
====================== 我自己的理解 ==========================
一: DTO 我自己的理解,就是 比如你有一個類,跟資料庫的table表結構一模一樣,主鍵外鍵什麼的都有,但是這個 model類,你返回資料到 UI層的時候,有些資料是不用的,你就得自己new一個新類出來,新的類從舊的類裡面拿值,然後給別人用的就是新的類別,有點類似於我們做介面給android手機用一樣的,資料庫的類和介面用的類,很相似,但是東西少了的很多,這個新的類(缺胳膊斷腿的),只用來傳遞資料的,就是DTO 資料轉送對象
二 : AutoMapper :這個就是一個工具,可以用來幫你把 舊的類和 新的類,進行一個資料隱射. 舊的類別和新的類別,可能是不一樣的,例如 舊的類別
一本書,有多個作者,每個作者,有自己的名字和地址,如果我想返回給 android的介面一個 json列表,每行資料就是這本書,以及這本書有哪些作者和作者的地址
那麼返回的類可能就是這個類的一個list,這個我們就可以用 AutoMapper來幫我們進行關係映射了
三 : Domain Model(領域模型) :這玩意又是個啥呢?
四: DDD 又是個啥??
======================= 推薦答案 ========================
一些orm架構,在用到Entity的時候有一些開原始碼用到了AutoMapper(如:nopcommence),將資料對象轉成DTO。比如在ORM中,與資料庫互動用的Model模型是具有很多屬性變數方法神馬的。而當我們與其它系統(或系統中的其它結構)進行資料互動時,出於耦合性考慮或者安全性考慮或者效能考慮(總之就是各種考慮),我們不希望直接將這個Model模型傳遞給它們,這時我們會建立一個貧血模型來儲存資料並傳遞。神馬是貧血模型?貧血模型(DTO,Data Transfer Object)就是說只包含屬性神馬的,只能儲存必須的資料,沒有有其它任何的多餘的方法資料什麼的,專門用於資料傳遞用的類型對象。在這個建立的過程中,如果我們手動來進行,就會看到這樣的代碼:
B b=new B();b.XXX1=a.XXX1;b.XXX2=a.XXX2;.........return b;
此時,AutoMapper可以發揮的作用就是根據A的模型和B的模型中的定義,自動將A模型映射為一個全新的B模型。基於訪問性的控制或從模型本身上考慮。對外開放的原則是,盡量降低系統耦合度,否則內部一旦變更外部所有的介面都要跟隨發生變更;另外,系統內部的一些資料或方法並不希望外部能看到或調用。類似的考慮很多,只是舉個例子。系統設計的原則是高內聚低耦合,盡量依賴抽象而不依賴於具體。這裡感覺automapper就是使資料庫實體對一個外部調用實體的轉換更簡便(不用一個屬性一個屬性的賦值)。
例如1:資料庫裡面有使用者資訊表,供別的系統調用,提供了資料介面。如果直接暴露了資料庫層的表結構的話,會對系統本身產生依賴。具體表現在,假定現在因為某種需要,為使用者資訊增加了十個欄位的資訊,那麼,如果不進行類型映射的話,會導致所有基於此使用者資料結構的模組集體掛掉(介面約定變更)。而如果使用了映射的話,我們可以在內部進行轉換,保持原有介面不變並提供新的更全面的介面,這是保證系統的可維護性和可遷移性。
例如2:一個Web應用通過前端收集使用者的輸入成為Dto,然後將Dto轉換成領域模型並持久化到資料庫中。相反,當使用者請求資料時,我們又需要做相反的工作:將從資料庫中查詢出來的領域模型以相反的方式轉換成Dto再呈現給使用者。使用AutoMapper(一個強大的Object-Object Mapping工具),來實現這個轉換。
可以參考下 http://www.cnblogs.com/jobs2/p/3503990.html
戀愛雖易,相處不易:當EntityFramework愛上AutoMapper
結婚雖易,終老不易:EntityFramework和AutoMapper的婚後生活
AutoMapper參考文檔:
- 【AutoMapper官方文檔】DTO與Domin Model相互轉換(上)
- 【AutoMapper官方文檔】DTO與Domin Model相互轉換(中)
- 【AutoMapper官方文檔】DTO與Domin Model相互轉換(下)