Как я могу реализовать устойчивый шаблон сессии на запрос в своем проекте при фокусировке на сокрытии информации?

Я в настоящее время разрабатываю проект MVC ASP.NET с NHibernate как его слой постоянства.

На данный момент, некоторая функциональность были реализованы, но только используют локальные сессии NHibernate: каждый метод, который получил доступ к базе данных (чтение или запись) должен инстанцировать своей собственной сессии NHibernate с "использованием ()" пункт.

Проблема состоит в том, что я хочу усилить лениво загружающиеся возможности NHIBERNATE улучшить производительность моего проекта.

Это подразумевает открыть сессию NHibernate на запрос, пока представление не представляется. Кроме того, одновременные запросы должны поддерживаться (несколько Сессий одновременно).

Как я могу достигнуть этого максимально чисто?

Я искал сеть немного и узнал о шаблоне сессии на запрос. Большинство реализаций, которые я видел, использовало своего рода Http* (HttpContext, и т.д.) объект сохранить сессию. Кроме того, использование функций Application_BeginRequest/Application_EndRequest является сложным, так как они уволены за каждый Запрос HTTP (aspx файлы, файлы CSS, js файлы, и т.д.), когда я только хочу инстанцировать сессии однажды на запрос.

Озабоченность, что я имею, - то, что я не хочу, чтобы мои представления или контроллеры имели доступ к сессиям NHibernate (или, в более общем плане, пространства имен NHibernate и код). Это означает, что я не хочу обрабатывать сессии на уровне контроллера, ни представлении один.

Я имею несколько опций в виду. Какой кажется лучшим?

  • Используйте перехватчики (как в Grails), который инициирован прежде и после действия контроллера. Они открыли бы и закрыли бы сессии/транзакции. Действительно ли это возможно в мире MVC ASP.NET?
  • Используйте CurrentSessionContext Singleton, обеспеченный NHibernate в веб-контексте. Используя эту страницу как пример, я думаю, что это довольно многообещающе, но это все еще требует фильтров на уровне контроллера.
  • Используйте HttpContext. Текущий. Объекты для хранения сессии запроса. Это, вместе с несколькими строками кода в Global.asax.cs, может легко предоставить мне сессию на уровне запроса. Однако это означает, что зависимости будут введены между NHibernate и моими представлениями (HttpContext).

Большое спасибо!

11
задан sduplooy 14 June 2012 в 11:32
поделиться

5 ответов

Хорошо, ребята, после нескольких дней работы, я наконец решил использовать httpContext.Courent.items для загрузки сеанса.

Это отлично работает!

Вот как я это сделал

import System.Web
class SessionManager {
    public static ISession GetSession()
        var session = HttpContext.Current.Items["NHibernateSession"];
        if (session == null) {
            session = ...; // Create session, like SessionFactory.createSession()...
            HttpContext.Current.Items.Add("NHibernateSession", session);
        }
        return session;
    }

    public static void CloseSession()
    {
        var session = HttpContext.Current.Items["NHibernateSession"];
        if (session != null) {
            if (session.IsOpen) {
                session.close();
            }
            HttpContext.Current.Items.Remove("NHibernateSession");
        }
    }
}

, используя статические методы, предоставляемые этим классом, можно получить сеанс (например, в контроллере), который привязан к текущему httpContext (текущий веб-запрос). Нам нужен другой фрагмент кода для вызова метода ClexSession (), когда запрос завершен.

В Global.Asax.cs:

protected void Application_EndRequest(object sender, EventArgs args)
{
    NHibernateSessionManager.CloseSession();
}

Событие Application_EndRequest автоматически вызывается, когда сеанс завершен, поэтому сеанс может быть правильно закрыт утилизация. Это полезно, потому что иначе нам придется сделать это в каждом контроллере!

13
ответ дан 3 December 2019 в 06:21
поделиться

Вы можете добавить фильтр действий, который может управлять сеансом и транзакциями Nibernate. (Это можно сделать на уровне действия или контроллера.) Вот пример этого:

http://weblogs.asp.nest/srkirkland/archive/2009/09/03/asp-net-mvc-transaction -Attribute-Nibernate.aspx

1
ответ дан 3 December 2019 в 06:21
поделиться

Используйте Di вместе с IOC. Большинство IOC поведен с поведением поведения в соответствии с запросом.

2
ответ дан 3 December 2019 в 06:21
поделиться

Это удар в темноте, но меня это не удивит, если реализация gnuwin32 sed будет duff (т.е. неисправна в некоторых путях). Можете ли вы попробовать реплицировать проблему с помощью поддержки AT & T U/Win POSIX для окон? Он прост в установке и включает оболочку Korn, sed и find , поэтому вместо FOR/R можно использовать find . (Мне интересно, часть проблемы в том, что MS FOR и gnuwin32 sed не играют хорошо вместе.)

-121--2267778-

Мы используем ClickOnce в нашей компании, и мне пришлось опубликовать пакет по URL . Однако в вашем случае вы всегда можете опубликовать с DNS-именем и попросить ваших клиентов использовать одно и то же DNS-имя в своей сети, и оно всегда должно работать.

-121--4028837-

Посмотрите на S # arp Architecture . Это очень хорошая архитектура для ASP.NET MVC и NHibernate.

1
ответ дан 3 December 2019 в 06:21
поделиться

Мое «решение» включает использование Unity для внедрения сеанса по запросу в контроллеры:

http://letsfollowtheyellowbrickroad.blogspot.com/2010/05/ nhibernate-sessions-in-aspnet-mvc.html

2
ответ дан 3 December 2019 в 06:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: