Сессии NHibernate: сколько? Когда создавать? Когда закрывать? - PullRequest
1 голос
/ 10 июня 2009

Я действительно борюсь с NHibernate здесь. Я пытаюсь сделать мою DAL-сборку очень общей, чтобы она работала в веб-тексте, в WCF и в WinForms / WPF. Моя проблема здесь в сессиях.

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

Я видел много людей, начинающих их на HttpContext.Begin и заканчивающих их на .End, но это нереально для меня, так как я не хочу, чтобы моя сборка ссылалась на System.Web или была связана вызываться в HttpContext.

Другой вариант - оставить один сеанс на весь жизненный цикл сборки DAL. Какие плюсы и минусы в этом подходе? Сборка будет в основном работать в качестве бэкэнда на веб-сайте, но также будет выполнять некоторую работу для приложения WinForms.

Кто-нибудь? :)

[EDIT] Другой вариант для меня - написать собственные прокси-коллекции с отложенной загрузкой, которые, в свою очередь, откроют новый сеанс и получат все данные, которые должны быть в коллекции. Любые комментарии по этому подходу?

1 Ответ

3 голосов
/ 10 июня 2009

В нашей системе у нас есть понятие единицы работы. Для нас единица работы - это единая операция против системы. Например, снятие денег со счета или внесение денег на счет будет одной единицей работы.

Класс единицы работы оборачивает сеанс NHibernate (и некоторые другие вещи), а затем наши репозитории работают против текущей единицы работы (через хранилище потоков).

С точки зрения того, что вы пытаетесь сделать, мы бы тогда сделали следующее ...

  • Для WCF у нас есть атрибут UnitOfWorkContext, который мы применяем к операции, которая отвечает за начало / окончание единицы работы.

  • Для WinForms мы бы просто дали докладчику начать / закончить единицу работы

  • Для WebContext мы бы сделали то же самое в HttpContext.Begin и .End

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