Как откатить транзакцию, используя шаблоны единиц работы и репозитория? - PullRequest
3 голосов
/ 24 сентября 2011

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

Создать метод в моем UserRepository. Я использую Dapper для DataAccess.

try
{
    this.Connection.Execute("User_Create", parameters, this.Transaction, 
        commandType: CommandType.StoredProcedure);
}
catch (Exception)
{
    //Need to tell my unit of work to rollback the transaction.                
}

Я передаю соединение и транзакцию, которые были созданы в конструкторе единиц работы, в мои репозитории. Ниже приведена информация о моём классе работы.

public UserRepository UserRepository
{
    get
    {
        if (this._userRepository == null)
            this._userRepository = 
                new UserRepository(this._connection, this._transaction);
        return this._userRepository;
    }
}

Я надеюсь выяснить лучший подход.

* Обновление * После более подробного исследования модели единицы работы, я думаю, что в своем примере я использую ее совершенно неправильно.

1 Ответ

5 голосов
/ 24 сентября 2011

Dapper поддерживает TransactionScope, который предоставляет метод Complete() для фиксации транзакции, если вы не вызываете Complete(), транзакция отменяется.

using (TransactionScope scope = new TransactionScope())
{
   //open connection, do your thing
   scope.Complete();
}
...