【发布时间】:2013-07-20 11:19:21
【问题描述】:
我知道IDataReader 是接口,DataReader 是具体类型,但我仍然不知道何时使用它们。我需要遍历可以使用Datareader 和IDataReader 的数据。有没有更好的方法来决定何时使用接口或具体类型?
【问题讨论】:
标签: c#
我知道IDataReader 是接口,DataReader 是具体类型,但我仍然不知道何时使用它们。我需要遍历可以使用Datareader 和IDataReader 的数据。有没有更好的方法来决定何时使用接口或具体类型?
【问题讨论】:
标签: c#
SqlDataReader 和所有其他数据提供者实现IDataReader。如果您认为将来可能将提供程序从 sql 更改为 oracle 或其他,请使用IDataReader。您可以在不更改使用IDataReader 的代码的情况下进行更改。否则你可以使用SqlDataReader。 但如果你使用IDataReader,那就是解耦设计,推荐使用。
【讨论】:
只要您想将阅读与(创建)实际阅读器分离,就可以使用界面。例如,用于测试或当您想要准备切换数据库时。
但通常使用 DataReader 的代码与阅读器紧密耦合,您不会为接口而烦恼。
【讨论】:
IDataReader 指的是一个接口。基本上,如果您的方法接受IDataReader,则意味着它将接受使用该接口的任何内容。这意味着您基本上可以使用任何您想要的数据阅读器。该方法将接受您的数据读取器,因为数据读取器实现了IDataReader 接口。
这样做的好处是该方法并不特定于特定类型的数据读取器。你也可以推出你自己的实现这个接口的类。
推荐这个LINK
【讨论】:
如果您的代码不绝对肯定需要了解具体类型(例如,使用某些仅在特定实现上可用的方法),那么我会说:参考界面。这使您的代码更加灵活 - 例如,添加位于 ADO.NET 管道中的分析装饰器(如“MiniProfiler”)将是微不足道的。如果您已硬编码为SqlDataReader,则无法执行此操作。这也意味着您可以完全更改后端。但坦率地说,这通常是一个巨大的决定,并且会涉及重大的代码更改,因此这种情况不太“明显”。
但是,我也认为大多数人编写了太多涉及 ADO.NET 的管道代码。有诸如“dapper”之类的工具,或更重(但功能更丰富)的 ORM 可以为您执行此操作,避免大量人为错误的风险。
【讨论】: