存储库模式逐步说明[关闭]


276

有人可以向我解释.NET中的存储库模式,一步一步给出一个非常简单的示例或演示。

我知道这是一个非常普遍的问题,但到目前为止,我还没有找到满意的答案。



1
这里有一个很好的文章:deviq.com/repository-pattern
ssmith

Answers:


199

作为总结,我将描述存储库模式的更广泛影响。它使您所有的代码都可以使用对象,而不必知道对象的持久性。所有关于持久性的知识,包括从表到对象的映射,都安全地包含在存储库中。

通常,您会发现散布在代码库中的SQL查询,并且当您向表中添加列时,您必须搜索代码文件以尝试查找表的用法。变化的影响是深远的。

使用存储库模式,您只需要更改一个对象和一个存储库。影响很小。

考虑一下为什么要使用存储库模式可能会有所帮助。原因如下:

  • 您只有一个地方可以更改数据访问权限

  • 您有一个地方负责一组桌子(通常)

  • 可以使用伪造的实现来替换存储库以进行测试,这很容易-因此您无需为单元测试提供数据库

还有其他好处,例如,如果您使用MySQL并想切换到SQL Server,但实际上我从未真正看到过这种好处!


28
RE从dbms a切换到b,我会继续记录下来,不仅看到了这一点,而且还在生产代码中做到了这一点。我们以前使用的是Oracle,必须切换托管服务提供商,并定居于Azure(在他们支持Oracle之前),因此我们不得不转换为SQL Azure。不幸的是,那时我们还没有分离所有的数据访问逻辑,但是我们确实做到了这一点,就像我们进行迁移一样(并且,我可能会补充说)。
2013年

5
我知道此评论很陈旧,已被关闭,成为离题的话题,但是我已经在多家公司中看到了这一评论。通常,这是迈向ORM或远离ORM的过程的一部分。该存储库使切换出来更加容易,尤其是当您从抽象工厂模式或使用IoC容器加载它们时。
Derek Van Cuyk

实际上,存储库使用DAO来进行与数据源相关的操作...
Yousha Aleayoub

1
@YoushaAleayoub,您提出了一个很好的观点。当人们试图“分离数据库”时,通常会找到数据访问对象;而当人们试图“使一件事情负责查询”时,通常会找到存储库。在几乎所有情况下,您都将找到两者。在DAO的部分是IConnectionICommand等部分隐藏的数据库的类型。该存储库通常更以域为中心。
Fenton

181

这是一个很好的示例:C#中的存储库模式示例

基本上,存储库隐藏了如何从数据库中正确地获取/持久存储数据的细节。在幕后:

  • 为了进行读取,它将创建满足提供的条件的查询并返回结果集
  • 在编写时,它发出使基础持久性引擎(例如SQL数据库)保存数据所需的命令

13
这个例子是迄今为止最好的解释,比MSDN文档更好。
Teoman shipahi 2014年

2
我发现很好。它还对工作单元提供了不错的解释,这似乎是数据模式而非存储库模式的更通用形式
Celdor 2014年

8
链接的示例是存储库模式失败。与使用实体框架(IDbContext)或ISession直接在nhibernate()中提供的接口相比,它根本没有优势。正确实现的存储库会抽象出所有持久性特定的信息(例如当前的Linq To Sql提供程序的工作方式)。即永不暴露IQueryable
jgauffin

3
@jgauffin IQueryable不是持久性特定的信息。IQueryable的支持可以像硬编码数组一样简单,也可以来自XML文件,Web服务,数据库,平面文件等。我不建议使用不会像往常一样暴露IQueryable的存储库。在每种情况下都会导致数据访问速度变慢,在这种情况下,如果持久性存储具有此功能,则暴露IQueryable将允许某些实例在适用的情况下提高性能。此外,隐藏DbContext允许您在需要时切换到其他ORM(或无需ORM!)
Robert McKee

5
它泄漏持久性信息特定的信息。在IN不知道特定的LinqToSql提供程序如何执行的情况下,尝试使用急切/延迟加载或构建sql子句。
jgauffin
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.