Session-Per-Request с SqlConnection / System.Transactions

Я только начал использовать 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();
        }
    }
}
15
задан Ben Foster 3 June 2011 в 14:33
поделиться