虽然SqlDataReader.Read()
实现了IDataReader.Read()
,但在使用ReadAsync()
等异步方法时似乎没有SqlDataReader
的界面。
首先,如果我错了,请纠正我。
这有什么理由或理由吗?有没有什么关于新的async-await东西证明缺乏接口在这里?这有点莫名其妙。
答案 0 :(得分:8)
虽然界面没有定义整个方法,但是有一个共同的抽象类DbDataReader
which defines ReadAsync
。
未将ReadAsync
作为IDataReader
界面的一部分包含在内的最重要原因可能是避免在向后兼容性方面发生重大变化。
如果较新的框架版本中的IDataReader
会强制任何数据读取器实现ReadAsync
,那么任何依赖于所谓接口的ADO.NET提供者或框架都不会完全实现它,这些实现将被打破。
也许他们可以使用接口隔离原则,他们可以定义一个名为IDataReaderAsync
的新接口,它可以提供常规IDataReader
成员的异步风格......但是,至少,他们已经提供了一个已经由许多框架类派生的基类:
System.Data.DataTableReader
System.Data.EntityClient.EntityDataReader
System.Data.Odbc.OdbcDataReader
System.Data.OleDb.OleDbDataReader
System.Data.OracleClient.OracleDataReader
System.Data.SqlClient.SqlDataReader
......和第三方ADO.NET提供商' IDataReader
也可能派生DbDataReader
。