2009-06-09 26 views
1

在閱讀了關於asp.net mvc的一些教程之後,存儲庫模式出現了,示例使用了一張表即dinners表。基本上建立的是創建一個接口,然後是一個具體的類,它實現了控制器類中的接口和程序。界面有你典型的粗俗方法。如果您要使用此模式,是否需要創建每種類型的接口?例如有一個帶有Dinner類型的GetList方法。如果你有10種不同的類型,你需要執行crud功能?這是否意味着10個具有10個具體類的接口只是爲了能夠將db技術切換到道路上? 我想弄清楚如何將這種模式應用於標準的3層架構(對象層,業務邏輯層,數據訪問層)。需要更深入的存儲庫模式和依賴注入示例

謝謝。

回答

7

這是我通常在我的實現中執行的方式。

一個通用接口,IEntityRepository定義您的基本CRUD結構。在我實現我定義了以下成員:

  1. 插入
  2. 更新
  3. 刪除
  4. 獲取
  5. GetPaged
  6. GETALL
  7. 查找(此人使用謂詞生成器生成where子句)

我創建了另一個繼承IEntityRepository的接口IMyentityRepository。這允許我添加任何特定於實體的成員,並且在需要時仍然可以使用DI。然後創建我的密封類MyentityRepository,繼承IMyentityRepository並實現所有成員。

當您使用依賴注入時,您可以爲MyentityRepository的具體類型註冊接口(IMyentityRepository)。

就我而言,我並沒有真正完成。我在存儲庫之上創建了一個服務層來封裝它,並以更一般的方式公開它。例如,假設您想爲您的用戶創建一個帳戶,這可能涉及比創建數據庫記錄更多的工作。在您的服務中,您將有一個名爲CreateUser()的成員,它可能會在其實現中調用多個存儲庫成員。 我的服務層與我的存儲庫層相同。我有通用的CRUD成員IEntityService,實體特定成員IMyentityService和MyentityService實現。 MyentityService類將需要一個IMyentityService實例(您可以將其注入到您選擇的IoC框架中)您的服務層也可以執行驗證和任何業務邏輯。我在控制器中進行驗證。好吧,從技術上講,我調用它我的控制器,然後得到結果,然後我可以寫入ModelState。

希望有所幫助。

2

這可能比您要查找的要多一點,但您可以在S#arp Architecture中查看示例Northwind應用程序。

存儲庫位於Northwind.Core項目中。

另外,使用存儲庫和DI的好處並非如此,您可以在將來某個日期切換底層數據庫技術。相反,您可以編寫單元測試,在這些單元測試中,您可以在其所依賴的類的測試中模擬和僞造服務(已由接口定義)。

0

您是否使用可用於任何表的CRUD方法創建通用IRepository類,以及爲每個表使用唯一的存儲庫類。

這是怎樣的問題試圖決定時,我會問:「如果每一個儲存庫支持創建,讀取,更新和刪除」

我選擇使用自定義存儲庫類,以便我的接口更加明確。例如,我有查表數據表,我不允許插入,更新或刪除。這些表的存儲庫僅包含Get方法。這爲我提供了一個更清潔的設計,但需要花費更多的工作。

+0

您是否正在創建一個接口,然後爲那些只獲取存儲庫的具體類? – TampaRich 2009-06-09 00:52:08