C# 使用IDataReader或SqlDataReader
我参加过的几个团队(不,我不记得我们在做什么,已经有一段时间了)在编码数据层CRUD方法时使用IDataReader而不是SqlDataReaderC# 使用IDataReader或SqlDataReader,c#,.net,ado.net,C#,.net,Ado.net,我参加过的几个团队(不,我不记得我们在做什么,已经有一段时间了)在编码数据层CRUD方法时使用IDataReader而不是SqlDataReader 有人能告诉我为什么我们的架构师总是喜欢IDataReader吗?原因与对接口进行编码有关:如果您对IDataReader进行编码,您可以更好地保证以后可以切换到不同品牌的RDBMS,如果需要的话。另一方面,如果您将代码编写到SqlDataReader,您的代码可能仍然很容易移植到Oracle中使用,但您对此的信心会降低(您也必须进行移植)。原因与编
有人能告诉我为什么我们的架构师总是喜欢IDataReader吗?原因与对接口进行编码有关:如果您对IDataReader进行编码,您可以更好地保证以后可以切换到不同品牌的RDBMS,如果需要的话。另一方面,如果您将代码编写到
SqlDataReader
,您的代码可能仍然很容易移植到Oracle中使用,但您对此的信心会降低(您也必须进行移植)。原因与编写到接口有关:如果您将代码编写到IDataReader
,如果有必要,您可以更好地保证以后可以切换到不同品牌的RDBMS。另一方面,如果您编码到SqlDataReader
,您的代码可能仍然很容易移植到Oracle中使用,但您对此的信心会降低(您也必须进行移植)。IDataReader
是抽象的,不是强制执行任何具体类型,而是契约(即执行CRUD操作)。出于可扩展性和可测试性的目的,首选
通过接口表示依赖关系,您可以更轻松地更改它们,无论是在单元测试中(当提供模拟对象而不是实际实现时)还是在非生产环境中(如使用不同的实现)
对于更多的研究,我建议看一看和其他相关的概念
为什么要更改数据层或完全替换数据库?
那太可笑了。您需要更改整个数据层的可能性相对较低(因为这是相当大的成本),但您需要支持其他数据层的可能性相当大。考虑下面的场景:
- 客户希望在Oracle Box上运行一个软件,因为这就是他们所拥有的,他们不希望在服务器上运行任何额外的数据库。从实用的角度来看,您永远不会将Oracle位暴露在DAL之外,而是保持它的干净性,并对接口进行编程
- 这个项目被证明足够吸引另一个客户。然而,他并没有那么富有,而且正在运行MySQL——整个DAL现在都必须在MySQL上工作,而且事实证明,在实现方面并不特别困难(将Oracle MySQL的差异放在一边)。大部分代码库是重用的
- 最后,作为一些负载平衡工作的一部分,Oracle客户端决定将一些计算委托给不同的盒子,所有盒子都在主从模式下工作(主从模式是原始软件,调整为主从模式)。从本质上讲,奴隶是运行在旧而慢的机器上的主机器的小版本。他们必须使用SQLite作为数据存储李>
经验教训-始终计划成功
IDataReader
是抽象,不是强制执行任何具体类型,而是契约(即执行CRUD操作)。出于可扩展性和可测试性的目的,首选
通过接口表示依赖关系,您可以更轻松地更改它们,无论是在单元测试中(当提供模拟对象而不是实际实现时)还是在非生产环境中(如使用不同的实现)
对于更多的研究,我建议看一看和其他相关的概念
为什么要更改数据层或完全替换数据库?
那太可笑了。您需要更改整个数据层的可能性相对较低(因为这是相当大的成本),但您需要支持其他数据层的可能性相当大。考虑下面的场景:
- 客户希望在Oracle Box上运行一个软件,因为这就是他们所拥有的,他们不希望在服务器上运行任何额外的数据库。从实用的角度来看,您永远不会将Oracle位暴露在DAL之外,而是保持它的干净性,并对接口进行编程
- 这个项目被证明足够吸引另一个客户。然而,他并没有那么富有,而且正在运行MySQL——整个DAL现在都必须在MySQL上工作,而且事实证明,在实现方面并不特别困难(将Oracle MySQL的差异放在一边)。大部分代码库是重用的
- 最后,作为一些负载平衡工作的一部分,Oracle客户端决定将一些计算委托给不同的盒子,所有盒子都在主从模式下工作(主从模式是原始软件,调整为主从模式)。从本质上讲,奴隶是运行在旧而慢的机器上的主机器的小版本。他们必须使用SQLite作为数据存储李>
经验教训-始终为成功做好计划我认为IDataReader是一个界面。它实现并处理许多处理数据库的类