Справочная информация
Я прочитал все виды блогов и документации по управлению сессиями nhibernate.Моя проблема, мне это нужно как для winforms и webforms.Да, я использую один и тот же слой данных в приложении winforms (windows .exe) и webforms (asp.net web).Я немного прочитал о шаблоне единицы работы и является хорошим выбором для winforms.Сохранение сеанса nhibernate в HttpRequest.Current.Items кажется хорошим способом использования веб-приложений.Но как насчет комбинированной сделки?У меня есть веб-приложения, приложения для Windows и службы WCF, которые должны использовать один и тот же слой данных nhibernate.Итак, вернемся к моему вопросу ...
Я планирую использовать этот дизайн: NhibernateBestPractices в моем веб-приложении, например, так:
private ISession ThreadSession {
get {
if (IsInWebContext()) {
return (ISession)HttpContext.Current.Items[SESSION_KEY];
}
else {
return (ISession)CallContext.GetData(SESSION_KEY);
}
}
set {
if (IsInWebContext()) {
HttpContext.Current.Items[SESSION_KEY] = value;
}
else {
CallContext.SetData(SESSION_KEY, value); // PROBLEM LINE HERE!!!
}
}
}
Проблема
Проблема, с которой я сталкиваюсь при использовании этого кода в моем приложении для Windows, связана со строкой
CallContext.SetData(SESSION_KEY, value);
. Если я правильно понимаю CallContext (), это сохранит сеанс открытым.всю жизнь моего приложения Windows, потому что он хранит сессию nhibernate как часть основного потока приложений.И я слышал много плохих вещей о том, что слишком долго держать сессию nhibernate открытой, и я знаю, что по замыслу это не значит оставаться открытой очень долго.Если все мои предположения верны, то приведенная выше строка кода представляет собой «нет, нет».
Учитывая все это, я хотел бы заменить вышеуказанную строку чем-то, что будет чаще разрушать сеанс nhibernate вприложение для WindowsНечто похожее на время жизни HttpRequest.Я не хочу предоставлять клиенту Windows информацию о сеансе (или транзакции) nhibernate и о том, когда его открывать и закрывать.Я хотел бы, чтобы это запускалось автоматически.
Вопрос
Итак, где я могу сохранить сеанс nhibernate в приложении для Windows, которое позволит мне (т.е.что-то кроме клиента) для автоматического начала и завершения транзакции по запросу к базе данных (то есть всякий раз, когда клиент делает вызов в БД)?
** Обновление **
Вот еще 2 ссылки о том, как реализовать шаблон единицы работы
http://msdn.microsoft.com/en-us/magazine/dd882510.aspx
http://www.codeinsanity.com/2008/09/unit-of-work-pattern.html