关于ISession的声明。
我们每次使用时都应关闭会话,还是应该保持开放?
我问这个是因为在NHibernate手册(nhforge.org)中,他们建议我们在Application_Start中声明一次,但我不知道是否应该在每次使用时关闭它。
由于
答案 0 :(得分:1)
您可以对ISessionFactory保留一个静态引用,这可以在Application_Start中为Web应用程序实际实例化。
但是,ISession不能保持打开状态,不能在两个或多个请求之间共享。您应该采用“每个请求一个会话”模式,它允许您为每个HTTP请求构建一个ISession,并在处理完请求后安全地处理它(假设您正在编写Web应用程序)。
例如,处理项目中的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)并注册您的ISession,其生命周期取决于HTTP请求(在这种情况下,Autofac将为您处理所有事情)。
答案 1 :(得分:0)
完成后,应关闭会话。有多种可能的方法来管理会话的生命周期,选择正确的方法是特定于每个方案的。 “工作单元”和“每个请求的会话”是两种最常用的会话生命周期管理模式。
在Application_Start中,您应该创建SessionFactory,而不是Session。 SessionFactory不需要关闭。