Метод возврата интерфейса - PullRequest
11 голосов
/ 04 февраля 2009

Привет всем,

Я думаю, в этой строке кода

IDataReader myReader = questDatabase.ExecuteReader(getQuest);

Я использую DAAB, но не могу понять, как и в чем смысл того факта, что метод ExecuteReader (DbCommand) возвращает интерфейс IDataReader.

Любой может объяснить, пожалуйста

Ответы [ 6 ]

16 голосов
/ 04 февраля 2009

Это позволяет вам DataReader без необходимости знать, какой тип DataReader вы используете (то есть SqlDataReader, OleDbDataReader, EtcDataReader), поэтому, если вы когда-нибудь захотите изменить используемый вами DataReader, это не повлияет на вашу логику, в других слова это дает вам абстракцию. Например:

вы можете использовать

IDbCommand command = GiveMeSomeCommand();
IDataReader r = command.ExecuteReader();

, не зная, каким провайдером вы пользуетесь

это может быть:

private static IDbCommand GiveMeSomeCommand()
{
    return new OleDbCommand();
}

или это может быть

private static IDbCommand GiveMeSomeCommand()
{
    return new SqlCommand();
}

или что-то еще.

EDIT:

Вы также можете использовать DBFactories.

DbProviderFactory factory = GiveMeSomeFactory();
IDbCommand command = factory.CreateCommand();
IDataReader r = command.ExecuteReader();

//and create more objects
IDataAdapter adapter = factory.CreateDataAdapter();
IDbConnection conn = factory.CreateConnection();

, а затем создайте своего провайдера в другом слое

private DbProviderFactory GiveMeSomeFactory()
{
    if(something)
        return SqlClientFactory.Instance;
    else if(somethingElse)
        return OracleFactory.Instance;
    else if(notThisAndNotThat)
        return MySqlFactory.Instance;
    else
        return WhateverFactory.Instance;

}
6 голосов
/ 04 февраля 2009

Метод вернет объект, который является экземпляром класса, и этот тип класса будет поддерживать IDataReader.

Дело в том, что тип объекта не важен, просто тот факт, что класс реализует интерфейс.

Если вы за рулем автомобиля, вам не нужно знать, является ли он бродом или тойотой, вы ведете машину таким же образом.

Интерфейс управления такой же, как только автомобиль поддерживает интерфейс, вы можете управлять им.

То же самое с IDataReader, если возвращаемый класс поддерживает интерфейс, вы можете использовать его.

4 голосов
/ 04 февраля 2009

«Возвращает интерфейс» действительно означает:

Возвращает экземпляр некоторого класса, который реализует этот интерфейс

В этом случае он возвращает объект, очень похожий на объект SqlDataReader, который позволяет вам выполнять методы, подобные Read(), и реализует интерфейсы IDisposable и IDataRecord.

4 голосов
/ 04 февраля 2009

Возвращает интерфейс, потому что реализация интерфейса не важна, просто API, который предоставляет интерфейс.

3 голосов
/ 04 февраля 2009

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

3 голосов
/ 04 февраля 2009

Он не возвращает интерфейс как таковой, но вместо этого объект, который поддерживает этот интерфейс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...