存储库模式逐步解释[关闭]
Posted
技术标签:
【中文标题】存储库模式逐步解释[关闭]【英文标题】:Repository Pattern Step by Step Explanation [closed] 【发布时间】:2012-08-12 17:14:21 【问题描述】:有人可以向我解释 .NET 中的存储库模式,逐步给出一个非常简单的示例或演示。
我知道这是一个很常见的问题,但到目前为止我还没有找到满意的答案。
【问题讨论】:
msdn.microsoft.com/en-us/library/ff649690.aspx 和 codeproject.com/Tips/309753/… 这里有一篇很好的文章:deviq.com/repository-pattern 【参考方案1】:作为总结,我将描述存储库模式的更广泛影响。它允许您的所有代码使用对象,而不必知道对象是如何持久化的。所有关于持久性的知识,包括从表到对象的映射,都安全地包含在存储库中。
很多时候,您会发现 SQL 查询分散在代码库中,当您向表中添加列时,您必须搜索代码文件以尝试查找表的用法。变化的影响是深远的。
使用存储库模式,您只需要更改一个对象和一个存储库。影响很小。
也许考虑一下为什么要使用存储库模式会有所帮助。以下是一些原因:
您只有一个地方可以更改您的数据访问权限
你有一个地方负责一组表(通常)
很容易将存储库替换为用于测试的虚假实现 - 因此您无需为单元测试提供可用的数据库
还有其他好处,例如,如果您使用 mysql 并想切换到 SQL Server - 但我从未在实践中真正看到过!
【讨论】:
RE 从 dbms a 切换到 b,我会继续记录,我不仅看到了这个,而且我已经在生产代码中完成了这个。我们以前使用 Oracle,不得不切换托管服务提供商,选择 Azure(在他们支持 Oracle 之前),所以我们不得不转换到 SQL Azure。不幸的是,我们当时还没有分离所有数据访问逻辑,但我们确实做到了,就像我们进行迁移一样(并且在未来,我可能会补充)。 我知道这条评论已经过时并且作为题外话而关闭,但我已经在多家公司看到过这种做法。通常,它是接近或远离 ORM 的过程的一部分。存储库使切换它变得更容易,尤其是当您从抽象工厂模式或使用 IoC 容器加载它们时。 其实 Repository 使用 DAO 来进行它的数据源相关操作... @YoushaAleayoub 你提出的观点很好。当人们试图“分离数据库”时,您通常会找到数据访问对象,而当人们试图“让单一事物负责查询”时,您通常会找到数据访问对象。在几乎所有情况下,您都会发现两者都在一起。 DAO 部分是隐藏数据库类型的IConnection
、ICommand
等部分。存储库通常更以领域为中心。【参考方案2】:
这是一个很好的例子:The Repository Pattern Example in C#
基本上,存储库隐藏了数据是如何从数据库中提取/保存到数据库的详细信息。幕后:
为了读取,它创建满足所提供条件的查询并返回结果集 对于写入,它发出使底层持久性引擎(例如 SQL 数据库)保存数据所需的命令【讨论】:
这个例子是最好的解释,简直比 MSDN 文档好。 我发现this 非常好。它还对工作单元提供了体面的解释,这似乎是数据模式比存储库模式更通用的形式 链接示例是存储库模式失败。与直接使用 Entity Framework (IDbContext
) 或 nhibernate (ISession
) 提供的接口相比,它根本没有任何优势。正确实现的存储库会抽象出所有持久性特定信息(例如当前 Linq To Sql 提供程序的工作方式)。即永远不要暴露IQueryable
。
@jgauffin IQueryable
不是持久性特定信息。 IQueryable 的支持可以像硬编码数组一样简单,也可以来自 XML 文件、Web 服务、数据库、平面文件等。我不推荐像往常一样不公开 IQueryable 的存储库在每种情况下都会导致数据访问缓慢,如果持久性存储具有该功能,则公开 IQueryable 将允许某些实例在适用的情况下进行性能增强。此外,隐藏 DbContext 允许您在需要时切换到不同的 ORM(或没有 ORM!)
它会泄露持久性信息的特定信息。尝试使用急切/延迟加载或构建IN
sql 子句,而不知道特定的 LinqToSql 提供程序是如何做到的。以上是关于存储库模式逐步解释[关闭]的主要内容,如果未能解决你的问题,请参考以下文章