2010-12-30 33 views
2

Мне нужны некоторые идеи и мысли о рефакторинге, которое я собираюсь сделать для нашего веб-приложения.Монорельс, nhibernate и шаблон для каждого запроса

Первоначально мы использовали шаблон сеансового запроса с NHibernate и ActiveRecord с помощью On_BeginRequest/On_EndRequest в HttpApplication для создания и удаления сеанса. Позже мы поняли, что любые исключения, связанные с БД, выбрасываются за пределы нашего монорельсового контекста, что означает, что наши спасатели не вступили в игру. В качестве другого побочного эффекта у нас не было возможности полностью пропустить создание сеансов NHibernate в любом действие, которое в некоторых случаях было бы желательно.

Итак, мы переписали его для создания сеансов в Initialize()/Contextualize() в нашем базовом контроллере и разместили их в Dispose() нашего базового контроллера. Мы также откатимся от сеанса в нашем контроллере спасения, чтобы предотвратить любые половинные письменные изменения в БД. Все идет нормально. Причина для этого в Dispose() заключается в том, что мы хотим, чтобы он работал с рендерингом представления из-за соображений ленивой загрузки, а также для компонентов, которые должны получить сеанс (мы могли бы переключиться на единицы работы для viewcomponents, но у них, похоже, нет Dispose() ...)

Однако у меня возникают проблемы с тупиковой ситуацией, когда мы начали трансакции в БД, которая не получает откат или не совершена, и я могу «т получить мою голову вокруг него, в основном из-за беспорядка мы сделали с таким подходом ...

Так что я нашел эту статью: http://hackingon.net/post/NHibernate-Session-Per-Request-with-ASPNET-MVC.aspx

И я подумал,«Фильтры, мы можем использовать это в MonoRail тоже! ", Bec ause это может нанести удар по BeforeAction и AfterRendering.

Мои вопросы, то есть:

  1. Что произойдет, если исключение происходит в фильтре?
  2. Will AfterRendering fire, даже если в действии или рендеринге возникает исключение?
  3. Вы бы порекомендовали этот подход, если нет, то каково ваше предложение?

Любые указатели очень ценятся!

+0

Вы пытались использовать объект NHibernate? –

+0

Мы используем ActiveRecordFacility, но я не чувствую себя комфортно с TransactionScope-way, потому что я понятия не имею о сеансах, созданных или удаленных. Я просто предпочитаю свою собственную оболочку, которая использует sessionFactory и создает сеанс по мере необходимости. Я надеюсь, что смогу реализовать шаблоны «session-per-request» и «unit-of-work» в одной оболочке. Как бы мне помог объект NHibernate в этом сценарии? – jishi

+0

Извините, не заметил упоминания ActiveRecord. Да, это либо ActiveRecordFacility, либо NHibernateFacility, а не оба. Что касается транзакций, попробовали ли вы механизм автоматического управления транзакциями? –

ответ

1
  1. Для обработки обработки исключений вам необходим обработчик ошибок приложения.

  2. Прикрепите отладчик и узнайте.

  3. Возможно, нет (хотя это моя статья). Он не работает с RenderAction. Лучше всего использовать контейнер IoC для управления временем жизни соединений.

 Смежные вопросы

  • Нет связанных вопросов^_^