存储库模式逐步解释

Sa *_*til 269 c# asp.net design-patterns repository

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

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

Fen*_*ton 195

作为总结,我将描述存储库模式的更广泛影响.它允许所有代码使用对象,而无需知道对象是如何持久化的.所有持久性知识(包括从表到对象的映射)都安全地包含在存储库中.

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

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

也许有必要考虑一下为什么要使用存储库模式.以下是一些原因:

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

  • 你有一个地方负责一组表(通常)

  • 使用虚假实现替换存储库很容易进行测试 - 因此您不需要为单元测试提供数据库

还有其他好处,例如,如果您使用MySQL并希望切换到SQL Server - 但我在实践中从未真正看到过这种情况!

  • RE从dbms a切换到b,我会记录下来,不仅我看到了这个,我在生产代码中完成了这个.我们之前使用过Oracle,不得不切换托管服务提供商,定居在Azure上(在他们支持Oracle之前),所以我们不得不转换为SQL Azure.不幸的是,我们当时没有将所有数据访问逻辑分开,但是我们确实按照我们的迁移进行了操作(并且我可能会添加). (27认同)
  • 我知道这个评论是陈旧的,并且作为偏离主题关闭,但我已经在多家公司看到了这一点.通常,它是向ORM移动或远离ORM的过程的一部分.存储库可以更轻松地将其切换出来,尤其是从抽象工厂模式或使用IoC容器加载它们时. (4认同)

two*_*wer 180

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

基本上,存储库隐藏了从数据库获取/持久保存数据的详细信息.在封面下:

  • 对于读取,它创建满足提供的条件的查询并返回结果集
  • 对于写入,它发出使基础持久性引擎(例如SQL数据库)保存数据所必需的命令

  • 这个例子是最好的解释,比MSDN文档更好. (12认同)
  • 链接的示例是存储库模式失败.与使用Entity Framework(`IDbContext`)或nhibernate(`ISession`)提供的接口相比,它没有任何优势.正确实现的存储库抽象出所有持久性特定信息(如当前Linq To Sql提供程序的工作方式).即永远不要暴露`IQueryable`. (8认同)
  • 它泄漏持久性信息特定信息.尝试使用急切/延迟加载或构建`IN` sql子句,而不知道特定的LinqToSql提供程序如何执行它. (5认同)
  • @jgauffin`IQueryable`不是持久性特定信息.IQueryable的支持可以像硬编码数组一样简单,也可以来自XML文件,Web服务,数据库,平面文件等.我不推荐没有公开IQueryable的存储库在每种情况下都会导致数据访问速度变慢,如果持久性存储具有该功能,那么暴露IQueryable将允许某些实例在适用的情况下执行性能增强.此外,隐藏DbContext允许您切换到不同的ORM(如果需要)(或没有ORM!) (3认同)
  • 我发现[这个](http://www.codeproject.com/Articles/615499/Models-POCO-Entity-Framework-and-Data-Patterns] [1])非常好.它还对工作单元提供了不错的解释,这似乎是存储库模式上数据模式的更通用形式 (2认同)