【问题标题】:Same object to read and to contain results读取和包含结果的相同对象
【发布时间】:2011-12-06 00:05:11
【问题描述】:

IDataReader 接口继承自 IDataRecord。 Read() 方法更改阅读器的状态,以便您可以检索字段:

var reader = new SomeIDataReader();
while (reader.Read()) {
    var firstField = reader[0];
}

IDataReader 包含读取器和记录。在我看来,这在一个类中混合了两个问题。我会返回一个记录对象,并像这样使用它:

var reader = new MyDataReader();
do {
    var record = reader.Read();
    if (record == null) break;
    var firstField = record[0];
} while (true);

这将数据读取器和数据容器的关注点分开,并且可以使用两个线程从同一源读取。

我的解决方案更好吗?让读者包含结果有哪些好处?为什么有人会选择 IDataReader 方法?

【问题讨论】:

  • 我能想到的唯一原因是它可以避免为每次读取的记录创建一个新对象(如果处理非常大的记录集,这是一个加号)。

标签: c# .net oop design-patterns sqldatareader


【解决方案1】:

拥有一个单独的记录对象的一个​​缺点是,天真的调用者可能认为他可以将它传递出去并独立于底层 IDataReader 使用它。

即他可能认为他可以在阅读器位于第一条记录时获取 IDataRecord,并在阅读器移动甚至关闭时使用它来引用第一条记录。如果没有具体化记录的开销,这显然是不可能的,这与读取器的高性能只进概念背道而驰。

我不会假装理解设计决策中涉及的所有思考过程,但我确信它经过仔细考虑并且是正确的设计(“正确”是指“最佳权衡”而不是比“完美”)。

【讨论】:

  • 一定是这个。特别是在 SQL 上下文中,DataRecord 会被延迟填充,这需要 DataReader。如果要与DataReader分开使用DataRecord,DataReader需要急切地读取所有字段,不能再懒加载数据。
猜你喜欢
  • 2017-09-30
  • 2012-02-17
  • 1970-01-01
  • 2020-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多