Самый простой способ - каждый раз создавать новый экземпляр, и это не дорогой процесс, потому что создание нового объекта в .NET занимает 0,00000000000000001 секунду (я читал это в блоге Аянде или где-то еще).
Я использую Autofac DI в своих проектах и обычно использую ISession в качестве контейнера (по одному на запрос). И затем каждый класс, который использует (прямо или косвенно) ISession, должен быть ограничен областью контейнера или ниже (фабричная область == каждое использование класса get - это новый экземпляр). Если класс, который использует ISession, имеет большую область действия (сессия = = singleton), вы столкнетесь с проблемами, которые у вас есть в данный момент.
Если ваш сервис одноразовый:
При первом запуске служба создается, эта служба использует ISession, которая должна иметь область видимости контейнера, и находится при первом запуске.
Следующий запрос к сервису (сервис в настоящее время создан) все еще имеет ссылку на созданный ISession (который был закрыт по предыдущему завершающему запросу), поэтому теперь он закрыт.
Я не рекомендую использовать ту же сессию IS, которую вы открываете / закрываете (это не рекомендуется в документации NHibernate), просто используйте область контейнера (у меня есть и у меня нет проблем с производительностью), или вам следует создать ISession вручную для каждого метода в вашем сервисе, например:
using(ISession s = ISessionFactory.OpenSession())
using(ITransaction t = .....)
....
Но это совсем не хорошо ...