使用IDataReader或SqlDataReader

时间:2012-10-21 21:20:46

标签: c# .net ado.net

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

有人可以告诉我为什么我们的建筑师总是喜欢IDataReader吗?

3 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:4)

IDataReader是抽象,不强制执行任何具体类型,而是签订合同(即执行CRUD操作)。出于可扩展性和可测试性的目的, programming to interface 是首选。

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

对于其他研究,我建议您查看dependency injection以及与SOLID principles相关的其他概念。

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

这太荒谬了。您需要更改整个数据层的机会相对较低(因为这是相当大的成本),但您需要支持其他的机会相当高。请考虑以下情况:

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

所以你去吧。这实际上发生在我一直在研究的项目中,并且在不到10个月的时间内,它们全部来自 Oracle,我们只需要到Oracle,MySQL和SQLite。当然,这些转换总是需要一些额外的工作(主要是由于DB差异),但重复使用多数的DAL代码。如果我们的DAL与Oracle紧密耦合,那会不可能实现?我相信它会,但我确信它会花费更多的时间和精力。

经验教训 - 始终计划成功

答案 2 :(得分:2)

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