NHibernate Сеанс и управление транзакциями в HttpModule - PullRequest
9 голосов
/ 18 сентября 2010

Я видел много реализаций в сети людей, управляющих своими сеансами и транзакциями NHibernate в HttpModule.

Модуль Http:

  1. создает сеанс в начале запроса
  2. упаковывает весь запрос в транзакцию
  3. фиксирует транзакцию в конце запроса

Если люди используют эту стратегию, как они справляются со следующим сценарием:

  1. запрос приходит
  2. получить объект из базы данных
  3. объект обновления
  4. объект не проходит проверку
  5. изменения в объекте все еще сохраняются, потому что транзакция фиксируется в HttpModule.

Похоже, что в описанном выше сценарии нет хорошего способа откатить транзакцию. Единственный план, который я могу придумать, это:

  1. написать мою проверку таким образом, чтобы она гарантированно прошла успешно перед обновлением моего объекта домена (исключает мою проверку из моей модели домена).
  2. управляйте моей транзакцией ближе к моей бизнес-логике и отбросьте идею прозрачного выполнения в HttpModule. (Я видел довольно много сообщений, рекомендую это)

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

1 Ответ

2 голосов
/ 18 января 2011

Вы можете использовать какую-то глобальную обработку исключений. Сейчас я использую System.AppDomain.CurrentDomain.UnhandledException. В этом обработчике вам нужно будет вызвать Transaction.Rollback(); А также condsider, устанавливающий некоторый флаг (который также действует только во время текущего запроса), который укажет, нужно ли вам совершать транзакцию или откатываться. Это может сделать код более понятным.

Редактировать В качестве альтернативы вы можете использовать Событие ошибки HttpApplication

public class HelloWorldModule : IHttpModule
{
    void Init(HttpApplication application)
    {
        application.BeginRequest += 
            (new EventHandler(this.Application_BeginRequest));
        application.EndRequest += 
            (new EventHandler(this.Application_EndRequest));
        //this is it
        applicaiton.Error +=
            (new EventHandler(this.Application_Error));
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...