Вы можете хранить одну единственную статическую ссылку на ISessionFactory, которая действительно может быть создана в Application_Start для веб-приложений.
Однако ISession не должен оставаться открытым и не может совместно использоваться двумя или более запросами.Вам следует принять шаблон «один сеанс на запрос», который позволяет вам создать один сеанс ISession для каждого HTTP-запроса и безопасно его утилизировать после обработки запроса (предполагается, что вы пишете веб-приложение).
Например, код, обрабатывающий сеансы NHibernate в вашем проекте, может выглядеть следующим образом:
public static class NHibernateHelper {
static ISessionFactory _factory;
public static NHibernateHelper(){
//This code runs once when the application starts
//Use whatever is needed to build your ISessionFactory (read configuration, etc.)
_factory = CreateYourSessionFactory();
}
const string SessionKey = "NhibernateSessionPerRequest";
public static ISession OpenSession(){
var context = HttpContext.Current;
//Check whether there is an already open ISession for this request
if(context != null && context.Items.ContainsKey(SessionKey)){
//Return the open ISession
return (ISession)context.Items[SessionKey];
}
else{
//Create a new ISession and store it in HttpContext
var newSession = _factory.OpenSession();
if(context != null)
context.Items[SessionKey] = newSession;
return newSession;
}
}
}
Этот код, вероятно, далеко не прост и не был протестирован (или фактически скомпилирован), но он должен работать.Для более безопасной обработки ваших сессий вы также можете использовать контейнер IoC (например, Autofac) и зарегистрировать ваши ISessions со временем жизни, которое зависит от HTTP-запросов (в этом случае Autofac будет обрабатывать все для вас).