Вам нужна стратегия управления сессиями, которая позволит вашему приложению эффективно функционировать и использовать преимущества, которые дает вам NHibernate - в частности, кэширование и отложенная загрузка.
Создание сеансов - это недорогой процесс, требующий небольшого объема оперативной памяти или ЦП, поэтому вам не нужно беспокоиться о сохранении или повторном использовании сеансов (действительно, их повторное использование может привести к некоторым неприятным и непредвиденным побочным эффектам). последствия). Фабрика сессий - это дорогая вещь, и ее нужно создавать один и только один раз при запуске приложения.
Практическое правило таково: время жизни сеанса должно быть достаточно длинным, чтобы после завершения сеанса не оставалось постоянных объектов, висящих в области видимости.
После завершения сеанса все отслеживание изменений для объектов, полученных из этого сеанса, прекращается, поэтому эти изменения не сохраняются, если вы не намеренно повторно присоедините этот объект к новому сеансу. Следовательно, сессия должна продолжаться до тех пор, пока объекты, которые вы извлекаете из нее, будут существовать. В веб-приложении это обычно означает сеанс для каждого запроса; в WinForms - сеанс для каждой формы.
В вашем случае, когда служба (я предполагаю, что она работает как служба Windows), выполняющая работу NHibernate, вы можете рассмотреть возможность создания сеанса для каждого нового запроса от приложения-потребителя рабочего стола, и утилизировать его, когда этот запрос будет обслужен. Не зная точно, как работает ваша служба и какой механизм настольное приложение использует для связи с ней (удаленное взаимодействие: WCF? Обычный старый SOAP?), Я не могу сказать более конкретно.
(Из этого общего правила есть некоторые исключения - предположим, у вас есть набор постоянных объектов, представляющих общий ресурс, на который ссылается другой код, но не изменяет его, вы можете загрузить их заранее при запуске приложения и оставить их с тех пор отключен.)
Если вы считаете, что при такой стратегии производительность снижается, возможно, вы просто слишком много общаетесь с базой данных, и ваш граф объектов сложен; в этом случае посмотрите кэширование второго уровня .