Dot-Net

帶有實體框架的儲存庫模式

  • March 23, 2011

儲存庫模式用於從使用的特定數據庫和對象關係映射技術(如 EF)中抽像出來。因此,如果我決定這樣做,將來我可以很容易地用 Linq to SQL 替換(例如)我的實體框架映射。

但是當我使用 EF 時,我有來自模型的實體類——也就是說,它們是從那個視覺化圖表生成的。如果我在我的儲存庫中使用這個生成的實體類,然後決定用其他東西替換 EF,那麼我將刪除該可視實體圖,這也意味著刪除類對嗎?

我要解決的問題是我的儲存庫將依賴於實體框架,即數據訪問層,因為它將使用 EF 生成的類。

如何刪除此依賴項?

另請注意,我使用 EF 主要是因為它能夠從該可視圖表生成所有內容 - 我只是設計圖表並讓它為我生成包含所有外鍵等的數據庫。我非常喜歡這一點,甚至不想想想 SQL 命令。

儲存庫始終依賴於數據訪問技術。這就是人們使用儲存庫的原因 - 將數據訪問依賴包裝到單獨的層。如果您決定更改數據訪問技術(恕我直言,您這樣做的可能性為 1%),您將必須創建新的儲存庫來實現與以前的相同介面。

引入儲存庫將增加一層新的複雜性。儲存庫有其優點和缺點。*僅僅因為“您將來可以更改數據訪問方法”*而引入它們是一個不好的理由。不要因為可能發生某些事情而設計您的應用程序。根據目前的實際需求(一種敏捷方式)設計應用程序,並在需要更改時重構您的程式碼——這是在市場上保持競爭力的唯一方法。功能是出售您的 SW,而不是針對任何類型的更改的開放式架構(好吧,有例外,但在這種情況下,開放式架構是頂級要求)。

使用 EF 時,您有多種創建實體的選擇:

  • 使用 cutom 工俱生成 Entity 對象。這是為 EDMX 創建“程式碼隱藏”文件的預設方法。它是 EFv1 (.NET 3.5 SP1) 中唯一可用的解決方案。
  • 使用 T4 模板生成實體對象、POCO、STE 或任何自定義實體類型(您可以修改生成邏輯)。這通常與 EFv4 一起使用。
  • 自己寫 POCO。這可以與 EFv4 一起使用,並且始終與 EF 4.1 中的程式碼優先方法一起使用。

如果您預計數據訪問技術在未來會發生變化,請使用 POCO 的第二種或第三種方法。對於 T4 模板,您可以簡單地複制生成的 POCO 或修改項目文件,這樣您就不會在刪除 EDMX 文件後失去它們。

如果您不確定第二種或第三種方法是否適合您,請查看我對這些問題的回答:

因為我以某種方式同意@Patko 的回答,所以您還應該查看Ayende 的部落格。他寫了幾篇關於過度使用儲存庫和過度建構應用程序的文章。他正在撰寫有關 NHibernate 的文章,但可以使用 EF 做出類似的決定。唯一的區別是 NHibernate 提供了更好的抽象,因此直接使用 NHibernate 的程式碼具有更好的可測試性。

引用自:https://stackoverflow.com/questions/5401957