Я в настоящее время разрабатываю проект MVC ASP.NET с NHibernate как его слой постоянства.
На данный момент, некоторая функциональность были реализованы, но только используют локальные сессии NHibernate: каждый метод, который получил доступ к базе данных (чтение или запись) должен инстанцировать своей собственной сессии NHibernate с "использованием ()" пункт.
Проблема состоит в том, что я хочу усилить лениво загружающиеся возможности NHIBERNATE улучшить производительность моего проекта.
Это подразумевает открыть сессию NHibernate на запрос, пока представление не представляется. Кроме того, одновременные запросы должны поддерживаться (несколько Сессий одновременно).
Как я могу достигнуть этого максимально чисто?
Я искал сеть немного и узнал о шаблоне сессии на запрос. Большинство реализаций, которые я видел, использовало своего рода Http* (HttpContext, и т.д.) объект сохранить сессию. Кроме того, использование функций Application_BeginRequest/Application_EndRequest является сложным, так как они уволены за каждый Запрос HTTP (aspx файлы, файлы CSS, js файлы, и т.д.), когда я только хочу инстанцировать сессии однажды на запрос.
Озабоченность, что я имею, - то, что я не хочу, чтобы мои представления или контроллеры имели доступ к сессиям NHibernate (или, в более общем плане, пространства имен NHibernate и код). Это означает, что я не хочу обрабатывать сессии на уровне контроллера, ни представлении один.
Я имею несколько опций в виду. Какой кажется лучшим?
Большое спасибо!
Хорошо, ребята, после нескольких дней работы, я наконец решил использовать 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 автоматически вызывается, когда сеанс завершен, поэтому сеанс может быть правильно закрыт утилизация. Это полезно, потому что иначе нам придется сделать это в каждом контроллере!
Вы можете добавить фильтр действий, который может управлять сеансом и транзакциями Nibernate. (Это можно сделать на уровне действия или контроллера.) Вот пример этого:
Используйте Di вместе с IOC. Большинство IOC поведен с поведением поведения в соответствии с запросом.
Это удар в темноте, но меня это не удивит, если реализация gnuwin32 sed
будет duff (т.е. неисправна в некоторых путях). Можете ли вы попробовать реплицировать проблему с помощью поддержки AT & T U/Win POSIX для окон? Он прост в установке и включает оболочку Korn, sed
и find
, поэтому вместо FOR/R
можно использовать find
. (Мне интересно, часть проблемы в том, что MS FOR
и gnuwin32 sed
не играют хорошо вместе.)
Мы используем ClickOnce в нашей компании, и мне пришлось опубликовать пакет по URL . Однако в вашем случае вы всегда можете опубликовать с DNS-именем и попросить ваших клиентов использовать одно и то же DNS-имя в своей сети, и оно всегда должно работать.
-121--4028837-Посмотрите на S # arp Architecture . Это очень хорошая архитектура для ASP.NET MVC и NHibernate.
Мое «решение» включает использование Unity для внедрения сеанса по запросу в контроллеры:
http://letsfollowtheyellowbrickroad.blogspot.com/2010/05/ nhibernate-sessions-in-aspnet-mvc.html