NHibernate - ISession

时间:2010-06-12 21:14:31

标签: nhibernate

关于ISession的声明。

我们每次使用时都应关闭会话,还是应该保持开放?

我问这个是因为在NHibernate手册(nhforge.org)中,他们建议我们在Application_Start中声明一次,但我不知道是否应该在每次使用时关闭它。

由于

2 个答案:

答案 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不需要关闭。