【发布时间】:2012-08-12 17:14:21
【问题描述】:
有人可以向我解释 .NET 中的存储库模式,逐步给出一个非常简单的示例或演示。
我知道这是一个很常见的问题,但到目前为止我还没有找到满意的答案。
【问题讨论】:
-
这里有一篇很好的文章:deviq.com/repository-pattern
标签: c# asp.net design-patterns repository
有人可以向我解释 .NET 中的存储库模式,逐步给出一个非常简单的示例或演示。
我知道这是一个很常见的问题,但到目前为止我还没有找到满意的答案。
【问题讨论】:
标签: c# asp.net design-patterns repository
作为总结,我将描述存储库模式的更广泛影响。它允许您的所有代码使用对象,而不必知道对象是如何持久化的。所有关于持久性的知识,包括从表到对象的映射,都安全地包含在存储库中。
很多时候,您会发现 SQL 查询分散在代码库中,当您向表中添加列时,您必须搜索代码文件以尝试查找表的用法。变化的影响是深远的。
使用存储库模式,您只需要更改一个对象和一个存储库。影响很小。
也许考虑一下为什么要使用存储库模式会有所帮助。以下是一些原因:
您只有一个地方可以更改您的数据访问权限
你有一个地方负责一组表(通常)
很容易将存储库替换为用于测试的虚假实现 - 因此您无需为单元测试提供可用的数据库
还有其他好处,例如,如果您使用 MySQL 并想切换到 SQL Server - 但我从未在实践中真正看到过!
【讨论】:
IConnection、ICommand 等部分。存储库通常更以领域为中心。
这是一个很好的例子:The Repository Pattern Example in C#
基本上,存储库隐藏了数据是如何从数据库中提取/保存到数据库的详细信息。幕后:
【讨论】:
IDbContext) 或 nhibernate (ISession) 提供的接口相比,它根本没有任何优势。正确实现的存储库会抽象出所有持久性特定信息(例如当前 Linq To Sql 提供程序的工作方式)。即永远不要暴露IQueryable。
IQueryable 不是持久性特定信息。 IQueryable 的支持可以像硬编码数组一样简单,也可以来自 XML 文件、Web 服务、数据库、平面文件等。我不推荐像往常一样不公开 IQueryable 的存储库在每种情况下都会导致数据访问缓慢,如果持久性存储具有该功能,则公开 IQueryable 将允许某些实例在适用的情况下进行性能增强。此外,隐藏 DbContext 允许您在需要时切换到不同的 ORM(或没有 ORM!)
IN sql 子句,而不知道特定的 LinqToSql 提供程序是如何做到的。