2

我一直在檢查NerdDinner教程。我正在閱讀使用LINQ to SQL和MVC2的原始PDF教程(http://aspnetmvcbook.s3.amazonaws.com/aspnetmvc-nerdinner_v1.pdf)。在該教程中,他們實現了一個數據上下文,然後實現了存儲庫類來與數據實體進行交互。NerdDinner MVC4版本 - 他們爲什麼刪除存儲庫類?

我看到項目已更新爲使用MVC4和實體框架(http://nerddinner.codeplex.com),因此我瀏覽了該代碼以查看他們實施了哪些更改。他們將項目更改爲代碼優先,每個數據實體都有獨立的模型類。我很驚訝地發現他們完全擺脫了倉庫。

我認爲這是通過良好的做法,通過存儲庫模式抽象與數據庫溝通......我知道教程往往使簡短的設計選擇不佳,但我想知道爲什麼一個教程已經實現存儲庫決定從這個版本中省略它們。

MVC4或EF中是否存在使存儲庫過時/冗餘的問題?

+0

EntityFramework和NHibernate(以及其他重量級ORM)已經*爲*版本庫。有時你需要進一步的抽象,大部分時間你都不需要。 –

+0

有趣的是,我在Contoso大學教程中教授的例子中,他們在EF中使用存儲庫(http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/implementing -the-repository-and-unit-of-work-patterns-in-an-asp-net-mvc-application) – Jim

+0

在我看來,這是完全多餘的並且不增加代碼。 NHibernate具有'ISession'接口,EF沒有'IDbContext',但將DbContext包裝到一個精簡接口中對於可測試性來說應該足夠了。另外,當你將一個沉重的ORM包裝到一個存儲庫中時,你可能會放棄一些好處,比如二級緩存或者創建精細查詢的能力。 –

回答

9

關於在存儲庫中包裝諸如實體框架這樣的高級抽象是否有意義存在很長時間的爭論。

從歷史上看,存儲庫非常棒。爲了能夠在不同的數據提供者之間進行切換,普通的舊的DataSet,文件,linq,不管什麼,都有一個額外的抽象層是安全的。

但是,許多EF純化論者聲稱EF已經是工作單元和存儲庫的抽象,數據上下文是工作單元,dbset是存儲庫。他們聲稱LINQ是查詢語言的足夠好的抽象,並且你不需要特定的,受限制的API。

其他人認爲,假設所有可能的提供者都是兼容的,因爲他們爲相同的LINQ查詢提供一致的結果。有些提供商可能會受到限制,甚至拒絕評估具體的查詢。這 - 人們說 - 意味着你仍然需要一個超過 EF的抽象,這樣才能保證爲更高層提供相同的數據協定。

如果有人決定從例如刪除存儲庫層,這是有可能的原因有兩個原因之一:

  • 有人意識到,倉庫只是讓這個例子更復雜,除去他們簡單
  • 一個誰是EF純粹主義者想提倡的事實,「沒有什麼應該站在EF之上」

個人而言,我喜歡存儲庫,並儘可能使用它們。

+0

很好的解釋,謝謝! – Jim

4

隨着CQRS受歡迎程度的增加,Repository模式有點不受歡迎,像Jimmy Bogard making good cases這樣的人反對使用它。

基本上,一個知識庫最終很容易成爲一個知道如何形成大量不同查詢的大類,違反了SRP。在一個複雜的系統中避免這種情況最終會給你提供大量的存儲庫,並且在簡單的系統中使用存儲庫只是過度工程。

+0

+1,很棒的鏈接,謝謝!我非常喜歡Bogard關於查詢對象的想法。 – Jim

+0

乾杯! :)任何使用臃腫存儲庫的人都可以在QueryObjects中看到這種感覺。 –

相關問題