Мне нужны некоторые идеи и мысли о рефакторинге, который я собираюсь сделать с нашим веб-приложением.
Сначала мы использовали шаблон сеанса для запроса с 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.
Мои вопросы:
- Что произойдет, если в фильтре возникнет исключение?
- Будет ли AfterRendering срабатывать, даже если в действии или рендеринге возникает исключение?
- Вы бы порекомендовали этот подход, если нет, что вы предлагаете вместо этого?
Любые указатели очень ценятся!