2009-02-06 45 views
18

我正在開始一個新項目,並決定嘗試合併DDD模式,並且還將Linq包含到實體中。當我查看EF的ObjectContext時,它似乎在執行存儲庫和工作單元模式的功能:實體框架作爲存儲庫和UnitOfWork?

存儲庫中的底層數據級接口是從實體表示中抽象出來的,我可以請求並保存數據通過ObjectContext。

工作單元的意義在於,我可以將所有插入/更新寫入objectContext,並在執行SaveChanges()時一次性執行它們。

將這些模式的另一層放在EF ObjectContext的頂部似乎是多餘的?它似乎也可以使用'partial class'將Model類直接合併到EF生成的實體的頂部。

我是DDD的新人,所以請讓我知道如果我在這裏失去了一些東西。

回答

17

我不認爲實體框架是一個很好的實現庫,原因如下:

  • 對象上下文是不夠抽象做的事情,引用它良好的單元測試,因爲它必然數據庫訪問。擁有一個IRepository引用可以更好地創建單元測試。
  • 當客戶端可以訪問ObjectContext時,客戶端可以做任何它關心的事情。你唯一真正的控制就是使某些類型或屬性保密。這樣很難實現良好的數據安全性。
  • 在一個非平凡的模型上,ObjectContext不夠抽象。例如,您可能將表和存儲過程映射到相同的實體類型。您並不是真的希望客戶端必須區分這兩種映射。
  • 在相關說明中,很難寫出全面且執行良好的業務規則和實體代碼。的確,這是否是一個好主意是值得商榷的。

在另一方面,一旦你有一個ObjectContext的,實施Repository模式是微不足道的。事實上,對於不是特別複雜的情況,Repository是ObjectContext和Entity類型的一個包裝。

+2

Thanks Craig。我在http://www.simonsegal.net/blog/2009/01/13/entity-framework-repository-specifications-and-fetching-strategies/的Simon Segal博客中發現了一些代碼,它提供了一些示例Repository實現爲實體框架。 – Weej 2009-02-06 15:03:53

+0

您目前是否在設計中使用EntityFramework?實施過程中是否有困難?再次感謝 – Weej 2009-02-06 15:06:51

7

我會說你應該把ObjectContext看作你的UnitOfWork,而不是作爲一個存儲庫。

ObjectContext不能作爲倉庫-imho--因爲它是「通用的」。 您應該創建自己的存儲庫,它在常規的CRUD方法旁邊有專門的方法(比如GetCustomersWithGoldStatus)。

因此,我要做的是創建存儲庫(每個聚合根目錄一個),並讓這些存儲庫使用ObjectContext。

0

我想有以下原因庫層:

EF疑難雜症的

當你看到一些關於EF(代碼第一版)當前教程,很明顯有一個需要處理的問題的數量,特別是圍繞對象圖(包含實體的實體)和斷開的情況。我認爲一個存儲庫層非常適合將它們封裝在一個地方。

的數據訪問機制

存儲庫中的清晰的畫面給出了一個特定的畫面作爲對BL是如何訪問和更新的數據存儲。它揭示了具有明確單一目的的方法,並且可以獨立於BL進行測試。標準示例來自教科書,查找()查找單個實體。更具體應用的例子,清除()清除數據庫表。

一種用於優化

你不可避免地碰到性能命中使用香草EF時發生。我使用存儲庫來隱藏BL中的優化機制。

例子,

GetKeys()項目從表緩存鍵(插入/更新的決定)。只讀密鑰比閱讀完整實體的速度更快,佔用的內存更少。

通過SqlBulkCopy進行批量加載。 EF將通過單獨的SQL語句插入。如果你想要一條語句插入多行,SqlBulkCopy是一個很好的機制。存儲庫封裝這個併爲SqlBulkCopy提供元數據。和Insert方法一樣,您需要一個StartBatch()和EndBatch()方法,它也是UnitOfWork圖層的一個參數。