1

我参加过的几个团队(不,我不记得我们所做的一切,已经有一段时间了)在编写数据层 CRUD 方法时使用 IDataReader 而不是 SqlDataReader。

有人能告诉我为什么我们的架构师总是喜欢 IDataReader 吗?

4

3 回答 3

5

原因与对接口的编码有关:如果编码为IDataReader,则可以更好地保证以后可以切换到不同品牌的 RDBMS,如果需要的话。SqlDataReader另一方面,如果您编写代码,您的代码可能仍然很容易移植到 Oracle,但您对此的信心会降低(而且您也必须进行移植)。

于 2012-10-21T21:23:46.347 回答
4

IDataReader是抽象,不强制执行任何具体类型,而是合同(即执行 CRUD 操作)。出于可扩展性和可测试性的目的,对接口进行编程是首选。

使用接口表示的依赖关系可以让您更轻松地更改它们,无论是在单元测试中(当提供模拟对象而不是实际实现时)还是在非生产环境中(例如使用不同的实现)。

对于其他研究,我建议看一下依赖注入和其他与SOLID 原则相关的概念。

为什么要更改数据层或完全替换数据库?

这是荒谬的。您需要更改整个数据层的可能性相对较低(因为这是相当大的成本),但您需要支持其他数据层的可能性相当大。考虑以下场景:

  • 客户想要在 Oracle 机器上运行的软件,因为这就是他们所拥有的,而且他们不希望在服务器上运行任何额外的数据库。务实,您永远不会暴露 DAL 之后的 Oracle 位,而是保持它的清洁并针对接口进行编程。
  • 项目结果足以吸引另一个客户。然而,他没有那么富有并且正在运行 MySQL 机器——整个 DAL 现在必须在 MySQL 上工作,结果证明它在实现方面并不是特别困难(撇开 Oracle-MySQL 的差异不谈)。大多数代码库被重用。
  • 最后,作为负载平衡工作的一部分,Oracle 客户端决定将一些计算委托给不同的机器,它们都以主从模式工作(主机是原始软件,调整为主从模式)。从机本质上是在旧的和慢速机器上运行的主机的小版本。他们必须使用 SQLite 作为数据存储。

所以你去。这实际上发生在我一直在从事的一个项目中,在不到 10 个月的时间里,这一切都从Oracle 变成了我们所需要的 Oracle、MySQL 和 SQLite。当然,这些转换总是需要一些额外的工作(主要是由于数据库差异),但大多数DAL 代码都被重用了。如果我们的 DAL 与 Oracle 紧密耦合,这不是可能的吗?我相信它会,但我同样肯定它会花费更多的时间和精力。

经验教训 -始终为成功做好计划

于 2012-10-21T21:24:40.807 回答
2

我认为 IDataReader 是一个接口。实现和处理许多处理数据库访问的类,而如果您使用 SqlDataReader 是一个实现的类,它实际上使用 IDataReader 接口,但不限于类 IDataReader 允许您实现并轻松更改数据库提供程序(如果您决定这样做)因此,将来如果要切换数据库引擎,可以避免重写引用

于 2012-10-21T21:29:07.923 回答