2013-11-18 3 views
1

Я вижу использование IDataReader вместо DbDataReader во многих примерах (и использование других интерфейсов ADO.NET вместо соответствующих классов).Зачем использовать IDataReader вместо DbDataReader?

Я знаю, что IDataReader - это интерфейс, а DbDataReader - это класс и т. Д. И т. Д. ... Мой вопрос не в том, как интерфейсы отличаются от классов.

IDataReader описывает интерфейс универсального устройства чтения данных.

DbDataReader также является общим (но абстрактным классом).

Их примеры использования кажутся эквивалентными.

Зачем использовать общий интерфейс считывателя данных вместо использования универсального класса чтения данных? В каких случаях требуется только использование интерфейса? Какие случаи требуют использования класса только?

Типичный пример:

DbCommand cmd = conn.CreateCommand(); 
..................... 
using (IDataReader reader = cmd.ExecuteReader()) 
{ 
    grid.DataSource = reader; 
    grid.DataBind(); 
} 

ответ

5

DbDataReader также общий

Ну, это абстрактной, но не родового. Вероятно, семантический аргумент, но это базового класс для разных читателей (SqlDataReader, OleDbDataReader и т.д.)

Основного преимущество использования интерфейса над абстрактным базовым классом, если кто-то решил использовать для чтения данных, что не унаследовать от DbDataReader.

В каких случаях требуется использование класса только

Конкретные классы всегда создаются - интерфейсы используются только сказать: «Я не забочусь , что конкретный класс, до тех пор, как это следует контракту с этими методами/свойствами ».

2

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

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

Плюс есть другие хорошие практики вне там, таких как Dependency Injection, Unit Testing и те достижимы, когда вы код отведенными и интерфейса ориентированного

Потратьте некоторое время прохождения надлежащей практики кодирования, такие как чтение этой book

+0

У вас есть написано то же, что и «Стэнли», но он объяснил это ясными словами. Таким образом, его ответ будет ответом. В любом случае, спасибо. – Paul

+0

Ничего, хорошо, что вы выбираете тот, который ясен – Adil

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