NHibernate - ISession - PullRequest
       3

NHibernate - ISession

2 голосов
/ 13 июня 2010

Об объявлении ISession.

Должны ли мы закрывать сессию каждый раз, когда мы ее используем, или мы должны держать ее открытой?

Я спрашиваю об этом, потому что в руководстве NHibernate (nhforge.org) они рекомендуют нам объявить это, например, в Application_Start, но я не знаю, следует ли закрывать его каждый раз, когда мы используем.

Спасибо

Ответы [ 2 ]

1 голос
/ 13 июня 2010

Вы можете хранить одну единственную статическую ссылку на 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 будет обрабатывать все для вас).

0 голосов
/ 13 июня 2010

Сессии должны быть закрыты, когда вы закончите с ними.Существует несколько возможных способов управления временем жизни сеанса, и выбор правильного зависит от каждого сценария.«Единица работы» и «Сеанс на запрос» являются двумя наиболее часто используемыми шаблонами управления временем жизни сеанса.

В Application_Start следует создать SessionFactory, а не Session.SessionFactory не нужно закрывать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...