Я обычно в конструкторе веб приложения (класс, который наследуется от System.Web.HttpApplication) добавляю следующий код:
BeginRequest += (sender, args) =>
{
try
{
CurrentSession = NHibernateManager.OpenSession();
}
catch (Exception ex)
{
_log.Error(ex);
throw;
}
};
EndRequest += (sender, args) =>
{
if (CurrentSession != null) CurrentSession.Dispose();
};
Который при каждом новом запросе создает сессию. И при выполнении запроса уничтожает её. Сессия NHibernate хранится в контексте текущего запроса, и доступна везде в приложении. Для доступа к ней я использую StructureMap, но это уже детали.
public static ISession CurrentSession
{
get { return (ISession)HttpContext.Current.Items["current.session"]; }
set { HttpContext.Current.Items["current.session"] = value; }
}