我正在使用實體框架開展一個項目。使用EF生成的類的部分類作爲業務層可以嗎?我開始認爲這是EF如何使用的。使用實體框架時,我應該使用部分類作爲業務層嗎?
我試圖使用DTO模式,很快就意識到我只是創建了一堆映射類,這些類正在複製我的工作,並且還導致了更多的維護工作和附加層。
我想使用自我跟蹤實體並將EF實體傳遞到所有圖層。請分享您的想法和想法。謝謝
我正在使用實體框架開展一個項目。使用EF生成的類的部分類作爲業務層可以嗎?我開始認爲這是EF如何使用的。使用實體框架時,我應該使用部分類作爲業務層嗎?
我試圖使用DTO模式,很快就意識到我只是創建了一堆映射類,這些類正在複製我的工作,並且還導致了更多的維護工作和附加層。
我想使用自我跟蹤實體並將EF實體傳遞到所有圖層。請分享您的想法和想法。謝謝
我不會那樣做。儘量保持圖層的獨立性。所以你的數據庫模式的一個小改動不會影響你的所有圖層。
實體可以用於數據層,但它們不應該。 如果有的話,提供要使用的接口並讓你的實體實現它們(在部分文件上),BL應該不知道實體,但不知道接口。
我認爲部分班將是一個好主意。如果模型重新生成,那麼您不會失去部分類中的業務邏輯。
作爲一種替代方法,您也可以僅查看EF4代碼,以便您不需要從數據庫生成模型。
我不會做,有以下原因:
但是,如果您有一些特定於數據模型的代碼,請將其作爲分類,以避免在重新生成模型時丟失它。
那麼你的建議是建立一個業務層的正確方法是什麼?使用DTO模式?使用存儲庫? – samsur 2010-05-31 03:24:00
我會使用部分類。 DDD-ish代碼中沒有數據層。有一個數據層,它駐留在SQL Server上。應用程序代碼應該只包含業務層和一些映射,這些映射允許在所提到的數據層中保留業務對象。
實體框架是你的數據訪問代碼,所以你不應該建立自己的。在大多數情況下,數據庫模式將被修改,因爲模型已經改變,而不是相反。
這就是說,我會勸阻你在所有層中分享你的實體。我重視UI和領域層的分離。我將使用DTO將數據傳入和傳出域。如果我有必要的自由,我甚至會使用CQRS模式來將映射實體擺脫到DTO - 我只是簡單地創建第二個EF數據訪問項目,僅用於讀取用戶界面的數據。它將建立在同一個數據庫之上。您可以通過讀取(貧乏 - 沒有業務邏輯)模型讀取數據,但可以通過發出針對使用EF和部分方法實現的實際模型執行的命令來修改它。
這是回答您的問題嗎?
我看了一下使用部分類,發現將數據庫模型暴露給UI層是有限制的。
的幾個原因:
如果你這樣做TDD,並按照YAGNI,那麼你將趨向於有專門爲你寫的操作而設計的結構,這將是更容易構造對(不需要創建不realated的測試,只是因爲其他對象測試他們在模型上)。在這種情況下,你可能有...
public class Order
{ ...
public Guid CustomerID { get; set; }
... }
而不是使用具有暴露引用EF產生的實體模型......
public class Order
{ ...
public Customer Customer { get; set; }
... }
這樣,顧客的ID只需要執行一個命令的操作。爲什麼你需要構建一個Customer
(以及潛在的其他對象)以執行與下單有關的操作?
如果你擔心重複和映射,然後看看Automapper
我明白了鬆耦合的概念,並保持層相互獨立的。我覺得這樣做比較容易。如果由EF生成的實體不能用於其他層,那麼更好的方法是什麼?能否請您提供一些明確的指導意見..謝謝 – samsur 2010-05-31 03:26:43
我編輯我的答案 – 2010-05-31 05:54:12