2013-07-29 85 views
3

最近我一直在閱讀使用存儲庫模式和DI來幫助創建易於測試的代碼,我想我理解它的大部分。不過,我遇到了一個問題。我需要爲我的應用程序業務層創建一個Rules對象。要創建規則,我需要能夠讀取和寫入兩個表。你將如何去實現一個對一個對象使用兩個表的存儲庫?存儲庫模式與多個表

例如:

ICollection<type> GetAllRules(); 

我會把在鍵入的內容,因爲它需要兩個表?

感謝

史蒂夫

+1

這聽起來像規則是兩個底層實體加上一些邏輯的集合。因此,您應該將兩個存儲庫分開,並使用「域服務」創建一個規則,以便與存儲庫進行交互。應用程序層然後與規則域服務進行交互。 –

+0

最近我遇到了同樣的問題。我使用了具有所有公共屬性的Base類,然後使用動態對象來獲取數據。但後來我們將Rules表更改爲包含數據版本的單個Ruleset表。這樣數據更具關聯性,我們不必使用動態對象。將來如果有一套新的規則,只需將它們添加到表中並分配一個版本號即可。不知道這是否會對你有幫助,但值得分享我的經驗。 – Nilesh

+2

很難回答這個問題,但我可能會嘗試ICollection GetAllRules();哪裏規則具有您期望規則所有的所有字段。存儲庫的要點是您隱藏了基礎表結構。因此,例如,如果規則ID由其名稱+內部ID號組成,但該表將其存儲在單獨的列中,則GetAllRules會根據數據庫中的內容進行映射,並將其作爲ID公開給每個想要的人。 – TheKingDave

回答

5

我不會具有一個存儲庫堅持。

由於福勒說

從概念上講,資源庫封裝組對象持久保存在數據存儲和對它們執行的操作,從而提供持久層的更面向對象的視圖。

這可能是爲什麼大多數實現傾向於暴露純域對象而不是衍生物(您的規則對象似乎是)。

我會爲您提到的兩個表提供兩個存儲庫,然後我將有一個工作單元來公開所有存儲庫,然後我將擁有一個負責化合物處理的業務層服務。

這種方法的一個優點是,存儲庫層保持清潔,這裏沒有涉及業務處理,沒有不明確的規則引入持久層。

+0

我一直在尋找你的方法,並有一個問題。在我的服務類中,如何使用Save或getRule方法將兩個表作爲一個對象返回? – Steve2056726

+1

看看工作單元是如何工作的。您可以使用這兩個存儲庫,這允許您在兩者上編寫查詢。根據您是否想要公開一個通用的IQueryable或特定的方法,檢索數據的方式可能略有不同。有一個教程可用http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/implementing-the-repository-and-unit-of-work-patterns-in- AN-ASP淨MVC應用程序 –