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