4

我知道这IDataReader是接口并且DataReader是具体类型,但我仍然不知道何时使用每个。我需要遍历可以同时使用Datareader和的数据IDataReader。有没有更好的方法来决定何时使用接口或具体类型?

4

4 回答 4

9

SqlDataReader和所有其他数据提供者实现IDataReader. 如果您认为将来可能将提供程序从sql更改为oracle 或其他内容IDataReader,请使用. 您可以在不更改您使用过的代码的情况下更改它IDataReader。否则你可以使用SqlDataReader. 但是如果你使用IDataReader它会是一个解耦的设计并且被推荐。

于 2013-07-20T11:27:42.883 回答
2

每当您想将阅读与(创建)实际阅读器分离时,您都可以使用界面。例如,用于测试或当您想要准备切换数据库时。

但通常 DataReader 消费代码与阅读器紧密耦合,您不会为接口而烦恼。

于 2013-07-20T11:21:49.680 回答
1

IDataReader是指一个接口。基本上,如果您的方法接受一个IDataReader,这意味着它将接受任何使用该接口的东西。这意味着您基本上可以使用任何您想要的数据阅读器。该方法将接受您的数据读取器,因为数据读取器实现了IDataReader接口。

这样做的好处是该方法不特定于特定类型的数据读取器。您还可以推出自己的实现此接口的类。

参考了这个链接

于 2013-07-20T11:21:37.127 回答
1

如果您的代码不是绝对肯定需要了解具体类型(例如,使用某些仅在特定实现上可用的方法),那么我会说:参考接口。这使您的代码更加灵活 - 例如,添加位于 ADO.NET 管道中的分析装饰器(如“MiniProfiler”)将是微不足道的。如果您已硬编码为SqlDataReader,则无法执行此操作。这也意味着您可以完全更改后端。但坦率地说,这通常是一个巨大的决定,并且会涉及重大的代码更改,因此这种情况不太“明显”。

但是,我还认为大多数人编写了太多涉及 ADO.NET 的管道代码。有诸如“dapper”之类的工具,或更重(但功能更丰富)的 ORM 可以为您执行此操作,避免了很多人为错误的风险。

于 2013-07-20T11:41:32.283 回答