Монорельс, nhibernate и шаблон сеанса для запроса - PullRequest
2 голосов
/ 30 декабря 2010

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

Сначала мы использовали шаблон сеанса для запроса с 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!», Потому что он может задействовать BeforeAction и AfterRendering.

Мои вопросы:

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

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

1 Ответ

1 голос
/ 08 февраля 2011
  1. Вам нужен обработчик ошибок приложения, чтобы заботиться об обработке исключений.

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

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

...