Управление сеансом NHibernate в луковой архитектуре

Я пытаюсь настроить NHibernate для обработки моих сеансов по веб-запросу. У меня есть проект, который инициализирует мой сеанс при использовании любого из моих репозиториев. Я хотел бы знать, как лучше всего управлять своим сеансом для каждого веб-запроса. Поскольку моя архитектура не связана, я бы не хотел открывать сеанс и закрывать сеанс в моем веб-проекте. Есть ли хороший способ справиться с этим, не требуя, чтобы веб-проект знал о существовании NHibernate?

Это мой поток запросов:

Веб-запрос -> ASP.NET MVC 3 -> Контроллер -> Служба -> Репозиторий (открывает сеанс) -> NHibernate -> База данных -> Вернуться к MVC и выйти.


person Tyler Wright    schedule 31.07.2012    source источник
comment
Но это запрос сеанса на (http) ... зачем вам скрывать это от веб-проекта?   -  person dotjoe    schedule 31.07.2012


Ответы (2)


Взгляните на S # arp Architecture. Это фреймворк, который обертывает NHibernate и предоставляет вам его, а также некоторые другие функции. Вы также можете сделать это с помощью контейнера внедрения зависимостей, такого как Castle Windsor или Ninject. (S # arp использует Castle Windsor).

Если вы хотите сделать это самостоятельно, вам нужно будет создать HttpModule, чтобы открывать и закрывать сеанс для вас в начале и в конце каждого веб-запроса. В начале запроса модуль открывает сеанс и сохраняет его в HttpContext.Items, который является хранилищем для каждого веб-запроса. Ваши репозитории получат сеанс отсюда при обработке запроса. (Для чистого дизайна создайте интерфейс ISessionManager, который используют репозитории, и реализацию, которая обращается к хранилищу для каждого запроса. Затем его можно тестировать по модулю.) Наконец, модуль будет сбрасывать и закрывать сеанс в конце запроса. Я проделал это однажды в проекте NHibernate, и хотя он был образовательным, это была большая работа.

S # arp - это большой фреймворк, который определяет большую часть структуры приложения. Если вы не хотите заходить так далеко, посмотрите на Виндзорский замок, чтобы абстрагироваться от этого для вас. Все, что вам нужно сделать (более или менее), - это настроить контейнер для создания экземпляров репозиториев с помощью объекта сеанса NHibernate для каждого запроса в качестве параметра конструктора. Если вы действительно хотите узнать, как это сделать, создайте свой собственный HttpModule, но я рекомендую использовать фреймворк в производстве.

person Carl Raymond    schedule 31.07.2012
comment
Я думаю, что катание по собственному желанию - лучший путь для меня на данный момент. Я основал свою архитектуру на следующем: blog.tonysneed. com / 2011/10/08 /, но я не совсем уверен, как подключить это к классу SessionHelper, который у меня есть из источника, найденного на этой странице. Я вставляю свою строку подключения в класс SessionHelper, кстати. Я действительно думаю, что HttpModule - это то, что вам нужно. Не могли бы вы предложить дополнительную помощь? - person Tyler Wright; 02.08.2012
comment
Я действительно с самого начала предлагаю использовать контейнер DI. Конечно, вы все равно можете создать свой собственный HttpModule или любой другой подход, который выберете. Если вы раньше не использовали DI, есть некоторая кривая обучения, но это совсем не плохо. DI - очень разумная вещь, и она действительно помогает вам запрограммировать себя в угол. Он сохраняет все слабо связанными, что и является сутью луковой архитектуры. В блогах есть множество сообщений об использовании DI с MVC и NHibernate. Удачи! - person Carl Raymond; 02.08.2012
comment
У меня есть вся моя структура, использующая Ninject в качестве DI. Используя ваш ответ, я смог точно понять, что искал. В итоге я подписался на этот ben.onfabrik.com/posts/yet -another-session-per-request-post в качестве основы для настройки сеанса для каждого запроса. В настоящее время я изучаю, как заставить Ninject Inject в ActionFilters, чтобы я мог внедрить свою реализацию UnitOfWork. Еще раз спасибо за ваш вклад и помощь! - person Tyler Wright; 02.08.2012

Вот отличная статья о том, как достичь сеанса на запрос с использованием контейнера IoC (Castle Windsor) http://blog.xelibrion.com/journal/2011/4/16/nhibernate-session-management-in-aspnet-mvc-application.html

person hazzik    schedule 01.08.2012