关于ISession的声明。
我们应该在每次使用会话时都关闭它,还是应该让它保持打开状态?
我之所以这样问,是因为在NHibernate手册(nhforge.org)中,他们建议我们在Application_Start中声明它一次,但我不知道我们是否应该在每次使用时都关闭它。
谢谢
发布于 2010-06-13 05:20:42
您可以只保留一个对ISessionFactory的静态引用,它确实可以在web应用程序的Application_Start中实例化。
但是,ISession不能保持打开状态,也不能在两个或多个请求之间共享。你应该采用“每个请求一个会话”的模式,它允许你为每个超文本传输协议请求构建一个单独的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),并使用依赖于ISessions请求的生命周期注册您的HTTP (在这种情况下,Autofac将为您处理所有事情)。
发布于 2010-06-13 18:26:36
当您使用完会话时,应该关闭它们。有多种可能的方法来管理会话的生命周期,并根据每个场景选择正确的方法。“工作单元”和“每个请求的会话”是两种最常用的会话生存期管理模式。
在Application_Start中,您应该创建SessionFactory,而不是会话。SessionFactory不需要关闭。
https://stackoverflow.com/questions/3030120
复制相似问题