Как Dapper создает экземпляр правильного класса команд в ADO.Net?

Как Dapper создает экземпляр DbCommand конкретного драйвера ADO.Net, используя экземпляр DbConnection?

Например, если я использую SAConnection, как Dapper создает экземпляр SACommand при запросе данных?

Образец

using (iAnywhere.Data.SQLAnywhere.SAConnection connection = 
DAL.ConnectionManager
   .GetOpenPoolConnection<iAnywhere.Data.SQLAnywhere.SAConnection>())
{
    connection.Execute("INSERT INTO Table1 (FallbackLanguageID, Guid) 
                        VALUES (?, ?)", new { fallbackLanguageID, newLocalizationGroup });
}

person BendEg    schedule 29.02.2016    source источник
comment
Даппер нет. ADO.NET сама создает надлежащие классы, когда вы вызываете фабричный метод.   -  person Panagiotis Kanavos    schedule 29.02.2016


Ответы (1)


Каждый конкретный DBConnection реализует IDBConnection, который имеет CreateCommand метод. Dapper просто называет это.

person Gediminas Masaitis    schedule 29.02.2016
comment
На самом деле, не совсем так. DbConnection сам по себе является абстрактным. Вам нужно вызвать фабричный метод для создания фактического класса соединения вместо создания жестко закодированного класса соединения. CreateCommand также является фабричным методом, который создает соответствующий класс команд. - person Panagiotis Kanavos; 29.02.2016
comment
И в этом прелесть Dapper, он использует все присущие ADO механизмы, поэтому он работает с любым соединением с базой данных, реализующим ADO. - person Gusman; 29.02.2016
comment
@PanagiotisKanavos Под каждым DBConnection я имел в виду каждого конкретного поставщика DBConnection, например MySqlConnection или NpgsqlConnection. Я отредактирую свой пост, чтобы сделать его более понятным. - person Gediminas Masaitis; 29.02.2016
comment
@PanagiotisKanavos, а какая разница, что сказал Гедиминас? это может быть фабрика внутри каждого встроенного типа соединения, но это часть интерфейса IDBConnection... - person Gusman; 29.02.2016
comment
@Gusman есть огромная разница - интерфейсы использовались в ADO 1.x и требовали знания типа драйвера во время компиляции. фабрики поставщиков были добавлены в 2.0, чтобы сделать реализацию кода доступа к данным независимой. Фабрика внутри класса соединения не вовсе не фабрика. Фабрика абстрактна по определению. Вы запрашиваете DbProviderFactory из списка фабрик провайдеров, которые вы используете для создания соединений и т. д. Никакие конкретные классы нигде не используются - person Panagiotis Kanavos; 29.02.2016
comment
Я думаю, что мы не говорим об одном и том же, в этом случае IDBConnection реализован в * DBConnection (MySqlConnection, SqlServerConnection и т. д.), а CreateCommand реализован в конкретном классе для создания правильной команды... Dapper, что использует это интерфейс IDBConnection для создания команды, а не фабрика, это может быть ADO 1.x, но это то, что он делает. - person Gusman; 29.02.2016