Мне нужны некоторые идеи и мысли о рефакторинге, которое я собираюсь сделать для нашего веб-приложения.Монорельс, 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.
Мои вопросы, то есть:
- Что произойдет, если исключение происходит в фильтре?
- Will AfterRendering fire, даже если в действии или рендеринге возникает исключение?
- Вы бы порекомендовали этот подход, если нет, то каково ваше предложение?
Любые указатели очень ценятся!
Вы пытались использовать объект NHibernate? –
Мы используем ActiveRecordFacility, но я не чувствую себя комфортно с TransactionScope-way, потому что я понятия не имею о сеансах, созданных или удаленных. Я просто предпочитаю свою собственную оболочку, которая использует sessionFactory и создает сеанс по мере необходимости. Я надеюсь, что смогу реализовать шаблоны «session-per-request» и «unit-of-work» в одной оболочке. Как бы мне помог объект NHibernate в этом сценарии? – jishi
Извините, не заметил упоминания ActiveRecord. Да, это либо ActiveRecordFacility, либо NHibernateFacility, а не оба. Что касается транзакций, попробовали ли вы механизм автоматического управления транзакциями? –