FluentNHibernate Управление сессиями в ASP.NET
Новое в NHibernate(мой отказ от ответственности). Я наткнулся на похожую и интересную статью, касающуюся MVC, однако мне более любопытно узнать, каковы общие рекомендации по управлению сессиями NHibernate в стандартном веб-приложении.
Я сталкивался с проектом Burrow, но начинаю понимать, что есть несколько разных направлений. Я знаю, что, возможно, не в моих интересах создавать новую SessionFactory каждый раз, когда мне нужно прикоснуться к базе данных, поэтому мне интересно, что сообщество делает для управления сессиями. Ты используешь нору? Вы оборачиваете свою SessionFactory в синглтон?
Любое направление или понимание всегда высоко ценится.
2 ответа
Чтобы ответить на ваш вопрос напрямую, ваш ISessionFactory
Объект должен быть одноэлементным. Вы можете сделать это программно (то есть, поместив его в синглтон C#) или настроив его в своем контейнере IoC.
Что касается сессий, Burrow выглядит хорошо, но преобладающий и самый простой шаблон для сессий в веб-приложениях - OpenSessionInView - поставляется из коробки с NHibernate 2.0.0. То есть ваш код доступа к данным вызывает ISessionFactory.GetCurrentSession()
скорее, чем ISessionFactory.OpenSession()
, Затем вы указываете, как управлять текущим сеансом фабрики, указав реализацию ICurrentSessionContext
, NHibernate предоставляет два готовых для выравнивания сеанса с веб-запросом. Это известно как "Контекстные сеансы" в документации.
Без сомнения, более сложное веб-приложение может потребовать более длительных разговоров со сложной отложенной загрузкой и т. Д., Но для стандартного веб-приложения достаточно контекстных сеансов NHibernate.
Я написал серию постов на эту тему, посвященных шаблонам доступа к данным NHibernate / Fluent NHibernate.
Первое, что я рекомендую, это абстрагироваться от взаимодействия с NHibernate.
Создание общего универсального и расширяемого репозитория NHiberate
Затем для обработки управления сеансами я реализовал шаблон "Сеанс для бизнес-диалога", который вместо того, чтобы иметь сеанс NH, существует в течение жизни одного запроса страницы, который является общим для ряда событий, например, страницы, которая позволяет вам внесите несколько изменений в форму, а затем в конце примените их навсегда или отмените.
Разговор за каждую бизнес-транзакцию с использованием PostSharp и IoC
Если бы я собирался написать этот пост сегодня, я бы больше не использовал PostSharp для обработки кода AOP (Aspect Orientated Programming) в моем проекте, я бы использовал Linfu.AOP или другую инфраструктуру для взаимодействия с AOP.