2010-05-30 54 views
5

我正在使用實體框架開展一個項目。使用EF生成的類的部分類作爲業務層可以嗎?我開始認爲這是EF如何使用的。使用實體框架時,我應該使用部分類作爲業務層嗎?

我試圖使用DTO模式,很快就意識到我只是創建了一堆映射類,這些類正在複製我的工作,並且還導致了更多的維護工作和附加層。

我想使用自我跟蹤實體並將EF實體傳遞到所有圖層。請分享您的想法和想法。謝謝

回答

0

我不會那樣做。儘量保持圖層的獨立性。所以你的數據庫模式的一個小改動不會影響你的所有圖層。

實體可以用於數據層,但它們不應該。 如果有的話,提供要使用的接口並讓你的實體實現它們(在部分文件上),BL應該不知道實體,但不知道接口。

+0

我明白了鬆耦合的概念,並保持層相互獨立的。我覺得這樣做比較容易。如果由EF生成的實體不能用於其他層,那麼更好的方法是什麼?能否請您提供一些明確的指導意見..謝謝 – samsur 2010-05-31 03:26:43

+0

我編輯我的答案 – 2010-05-31 05:54:12

0

我認爲部分班將是一個好主意。如果模型重新生成,那麼您不會失去部分類中的業務邏輯。

作爲一種替代方法,您也可以僅查看EF4代碼,以便您不需要從數據庫生成模型。

1

我不會做,有以下原因:

  1. 你失去的數據層和業務層之間的明顯區別
  2. 它使業務層更難以測試

但是,如果您有一些特定於數據模型的代碼,請將其作爲分類,以避免在重新生成模型時丟失它。

+0

那麼你的建議是建立一個業務層的正確方法是什麼?使用DTO模式?使用存儲庫? – samsur 2010-05-31 03:24:00

0

我會使用部分類。 DDD-ish代碼中沒有數據層。有一個數據層,它駐留在SQL Server上。應用程序代碼應該只包含業務層和一些映射,這些映射允許在所提到的數據層中保留業務對象。

實體框架是你的數據訪問代碼,所以你不應該建立自己的。在大多數情況下,數據庫模式將被修改,因爲模型已經改變,而不是相反。

這就是說,我會勸阻你在所有層中分享你的實體。我重視UI和領域層的分離。我將使用DTO將數據傳入和傳出域。如果我有必要的自由,我甚至會使用CQRS模式來將映射實體擺脫到DTO - 我只是簡單地創建第二個EF數據訪問項目,僅用於讀取用戶界面的數據。它將建立在同一個數據庫之上。您可以通過讀取(貧乏 - 沒有業務邏輯)模型讀取數據,但可以通過發出針對使用EF和部分方法實現的實際模型執行的命令來修改它。

這是回答您的問題嗎?

2

我看了一下使用部分類,發現將數據庫模型暴露給UI層是有限制的。

的幾個原因:

  1. 創建的實體模型包括,這取決於你的架構,會得到暴露在UI層深厚關係的對象模型(說MVP的主持人或視圖模型中MVVM )。
  2. 業務邏輯層通常顯示您可以編寫針對操作。如果你看到一個在BLL保存方法,並期待在做保存和查看需要其他實體的建設(的關係性質的實體模型原因)只是做了保存模型所需要的參數,它不保持操作簡單。
  3. 如果你有一堆Web服務,則額外的數據都需要使沒有明顯的增益發送。
  4. 您可以創建更多的不可變的DTO對您的操作參數,而不是遇到的副作用導致同一個實例是在應用程序的其他部分進行修改。
  5. 如果你這樣做TDD,並按照YAGNI,那麼你將趨向於有專門爲你寫的操作而設計的結構,這將是更容易構造對(不需要創建不realated的測試,只是因爲其他對象測試他們在模型上)。在這種情況下,你可能有...

    public class Order 
    { ... 
        public Guid CustomerID { get; set; } 
    ... } 
    

而不是使用具有暴露引用EF產生的實體模型......

public class Order 
{ ... 
    public Customer Customer { get; set; } 
... } 

這樣,顧客的ID只需要執行一個命令的操作。爲什麼你需要構建一個Customer(以及潛在的其他對象)以執行與下單有關的操作?

如果你擔心重複和映射,然後看看Automapper

相關問題