В настоящее время я создаю проект ASP.NET MVC с NHibernate в качестве уровня его прочности.Как я могу реализовать надежный шаблон сеанса за запрос в моем проекте, а также сосредоточиться на скрытии информации?
В настоящее время реализована некоторая функциональность, но используются только локальные сеансы NHibernate: каждый метод, который обращается к базе данных (чтение или запись), должен создать экземпляр собственного сеанса NHibernate с помощью предложения «use()».
Проблема в том, что я хочу использовать возможности ленивой загрузки NHibernate для повышения производительности моего проекта.
Это подразумевает открытый сеанс NHibernate для каждого запроса до отображения визуализации. Кроме того, одновременные запросы должны поддерживаться (одновременно несколько сеансов).
Как я могу достичь этого как можно чище?
Я искал в Интернете немного и узнал о шаблоне сеанса за запрос. Большинство реализаций, которые я видел, использовали какой-то объект Http * (HttpContext и т. Д.) Для хранения сеанса. Кроме того, использование функций Application_BeginRequest/Application_EndRequest сложное, поскольку они запускаются для каждого HTTP-запроса (aspx-файлы, css-файлы, js-файлы и т. Д.), Когда я хочу только создать экземпляр сеанса один раз для каждого запроса.
Опасность, которую я испытываю, заключается в том, что я не хочу, чтобы мои взгляды или контроллеры имели доступ к сеансам NHibernate (или, в более общем смысле, пространствам и коду NHibernate). Это означает, что я не хочу обрабатывать сеансы на уровне контроллера или в режиме просмотра.
У меня есть несколько вариантов. Какой из них кажется лучшим?
- Используйте перехватчики (как в GRAILS), которые срабатывают до и после действия контроллера. Они откроют и закрывают сеансы/транзакции. Возможно ли это в мире ASP.NET MVC?
- Используйте синтаксис CurrentSessionContext, предоставляемый NHibernate в контексте Web. Например, используя this page, я думаю, что это довольно многообещающе, но для контроллеров все еще требуются фильтры.
- Используйте HttpContext.Current.Items для хранения сеанса запроса. Это, в сочетании с несколькими строками кода в Global.asax.cs, может легко предоставить мне сеанс на уровне запроса. Однако это означает, что зависимости будут вводиться между NHibernate и моими представлениями (HttpContext).
спасибо!
«зависимостей будет закачиваться между NHibernate и моих взглядов» -> это не совсем понятно, что вы имеете в виду с этим, можете ли вы объяснить дальше? –
Если я использую HttpContext для хранения сеанса NHibernate, аспект вида моего приложения MVC будет связан с аспектом доступа к данным (сеанс NHibernate). –
@ggervais: это происходит только в том случае, если вы используете ленивую загрузку в своих представлениях, чего не следует. –