C# NerdDinner MVC4版本-他们为什么删除存储库类?

C# NerdDinner MVC4版本-他们为什么删除存储库类?,c#,asp.net-mvc-4,entity-framework-5,repository-pattern,nerddinner,C#,Asp.net Mvc 4,Entity Framework 5,Repository Pattern,Nerddinner,我一直在看NerdDinner的教程。我正在阅读使用LINQtoSQL和MVC2的原始PDF教程()。在该教程中,他们实现了一个数据上下文,然后实现了存储库类以与数据实体交互 我看到项目已经更新为使用MVC4和Entity Framework(),所以我浏览了这些代码,看看他们实现了哪些更改。他们将项目改为代码先行,为每个数据实体使用单独的模型类。我惊讶地看到,他们完全摆脱了存储库 我认为通过存储库模式抽象与数据库的通信通常是一种好的做法。。。我知道,为了简洁起见,教程通常会做出糟糕的设计选择,

我一直在看NerdDinner的教程。我正在阅读使用LINQtoSQL和MVC2的原始PDF教程()。在该教程中,他们实现了一个数据上下文,然后实现了存储库类以与数据实体交互

我看到项目已经更新为使用MVC4和Entity Framework(),所以我浏览了这些代码,看看他们实现了哪些更改。他们将项目改为代码先行,为每个数据实体使用单独的模型类。我惊讶地看到,他们完全摆脱了存储库

我认为通过存储库模式抽象与数据库的通信通常是一种好的做法。。。我知道,为了简洁起见,教程通常会做出糟糕的设计选择,但我想知道,为什么已经实现了存储库的教程会决定在此版本中省略它们


MVC4或EF中是否存在使存储库过时/冗余的东西?

关于在存储库中封装像实体框架这样的高级抽象是否有意义,存在着长期的争论

历史上,存储库是伟大的。有一个额外的抽象层是安全的,只是为了能够在不同的数据提供者之间切换,普通的旧数据集、文件、linq等等

然而,许多EF纯粹主义者声称EF已经是工作单元和存储库的抽象,数据上下文是工作单元,数据库集是存储库。他们声称LINQ是查询语言足够好的抽象,您不需要特定的、受限的API

其他人说,假设所有可能的提供者在某种意义上都是兼容的,即它们为相同的LINQ查询提供一致的结果,这是不安全的。一些提供者可能受到限制,甚至拒绝评估特定的查询。人们说,这意味着您仍然需要在EF上进行一个抽象,这样您就可以保证在更高层使用相同的数据契约

如果有人决定从示例中删除存储库层,这可能是因为以下两个原因之一:

  • 有人意识到,存储库只是使示例更加复杂,为了简单起见,将其删除
  • 有人是EF纯粹主义者,他主张“没有什么比EF更重要”

就个人而言,我喜欢存储库,并尽可能使用它们

随着的普及,存储库模式有点不受欢迎,像Jimmy Bogard这样的人反对使用它


基本上,存储库很容易成为一个大型类,它知道如何形成大量不同的查询。在一个复杂的系统中避免这一点,最终可能会给您提供大量的存储库,而在一个简单的系统中使用一个存储库仅仅是工程上的事。

EntityFramework和NHibernate(以及其他重量级的ORM)已经是存储库了。有时候你需要进一步的抽象,大多数情况下你不需要。有趣的是,我脱离了Contoso大学教程中的例子,在那里他们使用EF()存储库,在我看来,EF()完全是多余的,并且添加了不需要的代码墙。NHibernate有
ISession
接口,EF没有
IDbContext
,但是将DbContext包装到一个瘦接口中应该足以实现可测试性。此外,当您将一个沉重的ORM包装到存储库中时,您可能会放弃一些好处,例如二级缓存或创建细粒度查询的能力。+1,非常好的链接,谢谢!我真的很喜欢Bogard关于查询对象的想法。干杯!:)任何使用过臃肿的存储库的人都可以从QueryObject中看到这种意义。