Как обрабатывать сеансы NHibernate в приложении ASP.NET WebForms? - PullRequest
2 голосов
/ 16 июля 2010

Я вижу, что есть 2 возможных сценария обработки сеанса:

  1. Открыть одну ISession за запрос. Откройте его в начале запроса и закройте в конце запроса.
  2. Откройте одну сессию IS на концептуальную «единицу работы». Многие сессии создаются для запроса.

Подход № 1 - это тот, который я делаю сейчас. Я немного беспокоюсь об этом, потому что, хотя это работает, его немного сложно отладить. Например, у меня есть объект, который не был сохранен (даже если я его заказал), и у меня возникают проблемы с отладкой, поскольку в течение полного жизненного цикла запроса происходит МНОГО вещей.

Подход №2, похоже, является стандартной передовой практикой (не уверен в ASP.NET), и я уверен, что отладка довольно проста. Проблема, которую я вижу, связана с межсессионным общением. Например: класс My Page содержит ссылку на пользователя, который является постоянным объектом. Многие из операций получают пользователя в качестве параметра. Поскольку пользователь принадлежит к другому сеансу, я не могу передать его в качестве параметра.

Я склонен к # 2, но я не знаю, является ли это наилучшей практикой или как обращаться с кросс-сессионным объектом.

Спасибо.

Ответы [ 4 ]

1 голос
/ 17 июля 2010

Для проекта ASP.NET, над которым я сейчас работаю, я использую комбинацию этих подходов.

Я открываю сеанс ISession в начале запроса и закрываю его в конце запроса, как вы делаете это с вашим первым подходом, и использую сеанс для загрузки любых объектов, которые должны оставаться присоединенными к сеансу для длительность запроса.

Однако, когда мне нужно сохранить, обновить или удалить объект, я создаю новый временный объект и передаю его новому ISession, отдельному от объекта, привязанного к запросу. Для дополнительных единиц работы я создаю дополнительные сеансы.

1 голос
/ 16 июля 2010

Большинство людей выполняют Session-Per-Request по причинам, которые вы изложили, и для простоты.

Однако вы можете открывать и фиксировать транзакции для каждой «единицы работы».Таким образом, у вас будет много транзакций для каждой сессии.(Обычно также рекомендуется убедиться, что при фиксации транзакции сеанс сбрасывается одновременно).

Например, после нажатия кнопки сохранения откройте и подтвердите транзакцию.

Сессия будет следить за всеми вашими сущностями.При необходимости транзакция позаботится о сбросе в базу данных.

При такой настройке вам будет легче отладить вашу проблему.

0 голосов
/ 18 июля 2010

Я думаю, что ваш реальный вопрос заключается в том, почему я не могу сохранить свои объекты.

Даже если вы используете один сеанс ISession, вам все равно нужно либо очистить сеанс, либо зафиксировать транзакцию для некоторого сохранения / обновления / удаления.действия для совершения.

0 голосов
/ 16 июля 2010

Вы можете найти NHibernate Burrow полезным или, по крайней мере, интересным в этом отношении, так как он предназначен для помощи в управлении сеансами в приложениях ASP .NET, реализуя концепцию «продолжительного разговора».это охватывает несколько запросов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...