2013-07-20 4 views
3

Я знаю, что IDataReader - это интерфейс, а DataReader - это конкретный тип, но я до сих пор не знаю, когда использовать его. Мне нужно перебирать данные, которые возможны с использованием как Datareader, так и IDataReader. Есть ли лучший способ решить, когда использовать интерфейс или конкретный тип?Когда использовать IDataReader и когда использовать DataReader?

+0

http://stackoverflow.com/questions/6137245/c-sharp-idatareader-sqldatareader-difference –

ответ

8

SqlDataReader и все другие поставщики данных реализуют IDataReader. Если вы считаете, что можете изменить провайдера из sql в oracle или еще что-нибудь еще в будущем, тогда используйте IDataReader. У вас будет возможность изменить это, не изменяя код, где вы использовали IDataReader. Кроме того, вы можете использовать SqlDataReader. Но если вы используете IDataReader, это будет развязанный дизайн и будет рекомендован.

1

IDataReader относится к интерфейсу. В принципе, если ваш метод принимает IDataReader, это означает, что он примет все, что использует этот интерфейс. Это означает, что вы можете использовать любой считыватель данных, который вы хотите в основном. Метод примет ваш datareader, потому что datareader реализует интерфейс IDataReader.

Преимущество этого в том, что этот метод не является специфичным для конкретного типа устройства чтения данных. Вы также можете запустить свой собственный класс, который реализует этот интерфейс.

Приглашен это LINK

2

Вы должны использовать интерфейс всякий раз, когда вы хотите, чтобы разъединить чтение из (создание) фактического читателя. Например, для тестирования или когда вы хотите быть готовым к переключению баз данных.

Но, как правило, потребительский код DataReader тесно связан с считывателем, и вы не потрудились бы с интерфейсом.

1

Если код не абсолютно положительно необходимо знать о конкретном типе (например, использовать какой-либо метод, который доступен только на конкретной реализации), то я бы сказал: обратитесь к интерфейсу. Это делает код более гибким - например, было бы тривиально добавлять в профилирующий декоратор (например, «MiniProfiler»), который находится в трубе ADO.NET. Если вы жестко закодированы до SqlDataReader, вы не сможете этого сделать. Это также означает, что вы можете полностью изменить сервер. Но, откровенно говоря, это, как правило, огромное решение и потребует значительных изменений кода, поэтому сценарий менее «очевидный».

Однако я бы также сказал, что большинство людей пишут слишком много сантехнического кода с использованием ADO.NET. Существуют инструменты, такие как «dapper» или более тяжелые (но более многофункциональные) ORM, которые могут сделать это для вас, избегая большого риска человеческой ошибки.

Смежные вопросы