2011-05-05 100 views
3

我計劃在EF 4中實現NTier設計。我知道EF本身基於它在數據庫中映射的表創建實體。我的問題是,DTO(數據傳輸對象)的用途是什麼?還是真的需要它?看起來它促進了冗餘,因爲您必須爲EF生成的每個實體創建另一個DTO實體。請指導我。謝謝..實體框架中的DTO

回答

9

DTO是數據傳輸對象,用於僅在物理層(當層位於另一個進程或另一個服務器上)之間傳輸所需的數據。如果您只需要公開姓名和年齡,則不需要轉移她的地址,工作單位,孩子等。因此,您將創建一個簡單的運輸對象,其中只包含姓名和年齡。

EF將創建將數據庫記錄映射到屬性的實體。 EF實體也可以通過部分類擴展到具有自定義計算屬性和方法的完整域對象。域對象不應直接暴露給不同的層,這是使用DTO的另一種情況。

編輯:

最後的情況DTO的使用是跨境調用優化。如果您有層級應用程序,其中一個層級調用另一個層級上的方法超出流程邊界,則應儘量減少這些調用,因爲這會降低性能(速度很慢)。爲此,您可以創建特殊的DTO,將複雜的數據結構(多個實體)轉移到遠程層上的某些主操作(外觀),這將進一步使用數據執行多個業務操作。

+0

我打算使用由EF生成的實體在我的3層設計層中,因爲我想避免創建DTO,這意味着UI可以直接訪問DAL(違反了ntier規則)。這種方法有什麼含義? – clydePHI 2011-05-05 13:39:08

+0

圖層和層不相同。層是邏輯邊界,而層是物理邊界。 – 2011-05-05 13:43:09

+0

所以我真正的意思是Layer,由DLL(BL,DAL)表示的圖層將被部署在同一臺機器上。 – clydePHI 2011-05-05 13:45:45

0

當您需要傳遞實體的一部分或捆綁在一起的幾個實體時,DTO是最有用的。此外,您的實體實際上與某些實體上下文綁定在一起,因此當您將實體傳遞到外部時,他們可以執行其上的方法,更改數據等。如果您只想傳遞外部對象,則可以從中受益使用DTO。

+0

所以你的意思是,創建分層EF應用程序時,DTO實際上是可選的? – clydePHI 2011-05-05 13:36:09

+0

,因爲我不會使用WCF/WS,它只是一個簡單的單個Web項目。 – clydePHI 2011-05-05 13:40:31

+0

您可以不使用DTO,但在這種情況下,您的實體會變成您的DTO,那麼您必須避免向您的實體添加方法(或使它們成爲內部方法),最終它會變成程序化的應用程序模型。所以,n層是不夠的,你將在你的n層應用模型中有多少層。由於您使用的是EntityFramework,因此您的DAL和Domain Model是相同的,如果您不打算使用DTO,那麼您的PresentationModel也將是相同的,並且如果您不打算在UI層中使用View模型,那麼您要對於一個簡單的網絡項目,有一個n層應用程序w/1層 – hazimdikenli 2011-05-05 13:55:00