2010-09-18 4 views
9

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

HttpModule:

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

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

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

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

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

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

+0

Я также приходит к тому же вопросу в последнее время. Я начинаю с NHibernate по некоторому проекту. Мой последний подход - использование Autofac для IOC и использование HttpRequestScope для сеансов. И все операции транзакций на уровне репозитория Business. Возможно, это не самое лучшее, но сейчас оно работает нормально. – Elph

+0

Проверка изменений вместо проверки изменений, применяемых к объекту, намного проще. – Paco

+0

Вы нашли ответ на этот вопрос? – Rippo

ответ

2

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

Редактировать Alternativly вы можете использовать событие ошибки в 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)); 
    } 
Смежные вопросы