Я только начал использовать Dapper для проекта, в последние несколько лет в основном использовал ORM, такие как NHibernate и EF.
Обычно в наших веб-приложения мы реализуем сеанс для каждого запроса, начиная транзакцию в начале запроса и фиксируя ее в конце.
Должны ли мы делать что-то подобное при работе напрямую с SqlConnection / System.Transactions?
Как это делает StackOverflow ?
По совету @gbn и @Sam Safron Я не использую транзакции. В моем случае я выполняю только запросы на чтение, поэтому, похоже, нет реальной необходимости использовать транзакции (вопреки тому, что мне говорили о неявных транзакциях).
Я создаю облегченный интерфейс сеанса, чтобы я мог использовать подключение по запросу. Это очень полезно для меня, так как с Dapper мне часто нужно создать несколько разных запросов для создания объекта, и я предпочитаю использовать одно и то же соединение.
Работа по определению области действия соединения для каждого запроса и его удалению выполняется моим IoC контейнер (StructureMap):
public interface ISession : IDisposable {
IDbConnection Connection { get; }
}
public class DbSession : ISession {
private static readonly object @lock = new object();
private readonly ILogger logger;
private readonly string connectionString;
private IDbConnection cn;
public DbSession(string connectionString, ILogger logger) {
this.connectionString = connectionString;
this.logger = logger;
}
public IDbConnection Connection { get { return GetConnection(); } }
private IDbConnection GetConnection() {
if (cn == null) {
lock (@lock) {
if (cn == null) {
logger.Debug("Creating Connection");
cn = new SqlConnection(connectionString);
cn.Open();
logger.Debug("Opened Connection");
}
}
}
return cn;
}
public void Dispose() {
if (cn != null) {
logger.Debug("Disposing connection (current state '{0}')", cn.State);
cn.Dispose();
}
}
}