2012-04-23 26 views
8

在我的asp.net mvc 3應用程序中,我使用了存儲庫模式。 我有3個實體,公司,國家,城市。他們每個人都有自己的存儲庫。公司實體擁有創建國家和創建城市外鍵。 現在在一個視圖中,我想顯示公司的詳細信息。在這個視圖中,我想查看公司詳細信息以及公司名稱和公司名稱。在我看來,我必須用一種JOIN查詢來處理這個問題。但我堅持如何在存儲庫模式下實現這一點。我如何處理這個存儲庫模式中的JOIN?如何用存儲庫模式查詢交叉表?

謝謝。

回答

4

存儲庫應該有一個基於任務的界面。這意味着ORM的,加入等是在倉庫裏面。該應用只是看到一個接口,它返回一個可以使用的對象。

這意味着你不要在表格周圍創建一個存儲庫(它幾乎無法達到目的)。在你的場景中,我建議你有(至少)2個倉庫:一個將處理與更新模型相關的所有內容,另一個將僅處理讀取(查詢)。

這意味着查詢存儲庫將只返回你想要的數據(它基本上返回視圖模型位)。當然,實際的表和連接是存儲庫的實現細節。

+0

「這意味着你不要在表格周圍創建一個存儲庫(它幾乎擊敗了目的)「。 據我所知,我必須爲每個實體創建一個存儲庫。 從您的評論,我想我必須添加另一個處理複雜查詢的存儲庫。對? – SherleyDev 2012-04-24 12:04:36

+0

否:)。您不必'爲每個實體創建存儲庫。該存儲庫基本上隱藏了與應用程序其餘部分相關的所有數據庫。在倉庫中你可以使用實體EF或Nhibernate,這並不重要。 repositoryu在內部使用orm,在您的情況下使用實體,然後返回應用程序可以理解的對象。實體本身已經是存儲庫使用的抽象。 – MikeSW 2012-04-24 12:14:24

+0

在下面的教程中它說:「在本教程中,您將爲每個實體類型實現一個存儲庫類。」我正在關注它。 http://www.asp。net/mvc/tutorials/getting-started-with-ef-using-mvc /實現-repository-and-unit-of-work-patterns-in-an-asp-net-mvc-application – SherleyDev 2012-04-24 12:16:20

2

不要以妨礙連接的方式構建存儲庫模式!這通常意味着對與當前HTTP請求關聯的所有實例使用相同的ORM上下文(DataContext/ObjectContext)。

我認爲這是一種反模式,因爲它擁有一個通用的IRepository,因爲數據庫訪問很少被同時限制爲單一類型的實體。

你可以認爲DataContext/ObjectContext本身就是一個倉庫。

最後一條建議:如果您不知道存儲庫抽象的優點 - 不要使用它。

+0

我不同意一件事情:Data Context應該被視爲一個存儲庫。雖然DC抽象出db訪問和sql,但它仍然與rdbms和IMO捆綁在一起,這充其量只是一個漏洞抽象。 – MikeSW 2012-04-24 10:09:14

+0

如果ORM是一個泄漏抽象,那麼定製存儲庫有多泄漏?這是一個篩子。同時它會阻止你訪問ORM的全部功能(這是抽象的本質)。 – usr 2012-04-24 10:16:24

+0

正確設計的存儲庫不會泄漏,因爲它不公開實施詳細信息,如ORM。存儲庫確實使用了ORM的全部功能,這是它的工作,而不是應用程序的其餘部分了解或使用orm的工作。請看這篇文章http://www.sapiensworks.com/blog/post/2012/04/15/The-Repository-Pattern-Vs-ORM.aspx – MikeSW 2012-04-24 11:06:48