2010-06-26 16 views
2

我打算在大型項目中使用實體框架4。爲什麼不使用EF在大型項目中生成的類?

我知道許多專業程序員建議依賴於我的業務類而不是EF模型類。

其實我腦子裏有聲音告訴我「不要依賴那些生成的類!只要讓你的手變髒,不要讓其他人爲你做。!!」

但實際上我不知道在這麼大的「企業」項目中使用這些生成的類的問題在哪裏。

所以請讓我明白爲什麼?

回答

5

使用EF生成的類絕對沒有錯。這就是他們在那裏。

但是,如果你誤用了這項技術,你會遇到很多問題。例如,很多初學者會嘗試使用這些EF生成的類的所有內容。他們將接受這些類,通過WCF或Remoting跨AppDomain邊界編組它們,也許它們將在它們的前端綁定到它們。這可能適用於基於CRUD的快速和骯髒的應用程序,但它不適用於具有任何實際大小的任何內容。

爲什麼不呢?因爲EF生成的類是在應用程序的數據「域」中建模的,而不是「域」表示。用戶可能想要與之交互的內容通常不是與數據庫中的表格1:1對象。例如,用戶可能有一個「產品」網格。在這個網格內,將包括該產品的總售價以及有關該產品的某些指示性數據。儘管指示性數據(名稱,大小等)可能會直接來自產品表,並且因此來自EF的生成的產品類,但是彙總數據(出售的總美元)是合計值。

我們通常所做的就是在我們的服務中使用EF生成的類,然後使用該服務將EF類轉換爲ViewModels,然後使用WPF綁定到我們的前端(或任何您最喜歡的技術) 。這讓我們分離了我們正在尋找的關注點。

+0

謝謝你的好解釋。但我不是在說使用ViewModel。我正在討論在ViewModel和EF Model「我的商業模型」層之間創建新的圖層「或輪胎」。這種分離是好事還是隻是一項額外的工作。 – 2010-06-26 15:50:50

+0

這幾乎總是額外的工作。是的,你可以,也許應該在你的類中創建另一個層,你的服務用它來創建你的ViewModels/etc,但是創建一個全新的層,你必須在AppDomain中編組另一類型的對象幾乎總是一個錯誤 - 一個當涉及到性能和可伸縮性時,您經常付出沉重的代價。 – 2010-06-26 16:10:40

+0

我同意戴夫。到目前爲止,我只在小型項目中使用過EF,但我還沒有找到需要單獨的Business Object層; EF實體一直足夠靈活以充當BOs。 – 2010-06-26 16:14:38

1

除了Dave的很好的答案之外,我想提一下使用生成的類的另一個重要缺點:它們來源於一個公共基類(EntityObject)。如果現有的域模型具有自己的繼承層次結構,則可能會造成問題,因爲.NET中不支持多繼承。

1

如果您的項目很大,我建議您關注域驅動開發。每個域類都包含許多組件:EF實體屬性,行爲屬性注入(格式化數據,解析,轉換,複製,驗證,配置)。

如果您遵循單一責任原則,每個班級應該只有1個責任。 EF模型類應該用於存儲數據並與EF基礎結構進行通信以生成運行時SQL。其他課程將負責格式化,轉換,驗證和轉移。

當類型數量增加時,您需要使用Facade模式集中或組織它們。這些Facades是特定於域的類型。因此,如果您從生成EF模型開始,然後構建支持類型(格式化程序,驗證程序...),並最終創建域類型,那麼您將不會獲得更高的協作和分發能力,因爲您可能獲得相反的結果。首先構建您的域類型,構建模擬和單元測試,然後與同伴共享它們,讓它們將域對象的函數與EF模型連接起來。這就是你如何做域驅動開發。

+0

我想問一下更多的解釋。任何例子或參考將不勝感激。 – 2014-04-25 19:23:03

+0

實體框架生成的模型類。它們應該用於保存數據。您需要創建具有LOB函數和EF實體作爲類成員的域類。這樣做會將狀態/數據(通過EF實體)存儲的問題與數據的實際轉換(通過非EF類)分開。 – Believe2014 2014-04-27 03:05:01

+0

我最近更新了項目的主頁,以宣佈即將發佈的版本和功能。如果您遵循單一職責原則,每個班級只應承擔一項責任。 EF模型類應該用於存儲數據並與EF基礎結構進行通信以生成運行時SQL。其他課程將負責格式化,轉換,驗證和轉移。 – Believe2014 2014-04-28 18:34:04

1

將EF生成的類一直暴露給Javascript時,需要特別小心。

首先,您可能會暴露出太多超出您需要的字段。這將增加有效負載並使攻擊者可以輕鬆猜測數據庫模式。其次,如果您還讓MVC Model Binder將HTTP(通過請求主體,URL或任何方式)數據反序列化到EF模型中,然後將其直接保存到數據庫中,則存在很大的風險。任何人都應該能夠緩和HTTP請求,向您發送一個JSON對象,以覆蓋您不希望的字段。想想這個購物車對象:

{cartItems: [{itemId:1, quantity:100, product:{ productId:23, price:0 }}]} 

如果我能在一個product傳遞與價格0和有效的productId,EF將覆蓋指定產品的價格在你的數據庫。

+0

但是,當你使用ViewModels時,這不是問題。我將ViewModels與我的視圖一起使用,並使用POCO EF類與我的DAL/BLL – 2014-04-27 07:37:07

+1

,如果您可以將BLL模型和DAL模型中的視圖模型分開,則這不會成爲問題。然而,很多博客似乎主張直接在DAL模型上添加屬性,以使它們成爲View模型,這可能是一個很大的風險。 – Believe2014 2014-04-27 22:03:16

相關問題