Управление сессиями NHibernate в ASP.NET MVC

В настоящее время я играю с классом HybridSessionBuilder, который можно найти в блоге Джеффри Палермо:

http://jeffreypalermo.com/blog/use-this-nhibernate-wrapper-to-keep-your-repository-classes-simple/

Используя этот класс, мой репозиторий выглядит так:

public class UserRepository : IUserRepository
{
    private readonly ISessionBuilder _sessionBuilder;

    public UserRepository(ISessionBuilder sessionBuilder)
    {
        _sessionBuilder = sessionBuilder;
    }

    public User GetByID(string userID)
    {
        using (ISession session = _sessionBuilder.GetSession())
        {
            return session.Get<User>(userID);
        }
    }
}

Это лучший способ управления сессией / фабрикой NHibernate? Я слышал кое-что о модуле работы, создании сеанса для каждого веб-запроса и его сбросе в конце. Из того, что я могу сказать, моя текущая реализация не делает ничего из этого. По сути, он полагается на то, что репозиторий извлекает сеанс из фабрики сеансов и использует его для выполнения запросов.

Есть ли подводные камни для доступа к базе данных таким образом?

13.12.2008 00:17:26
не уверен насчет ловушек, но вы можете проверить реализацию шаблона Unit of Work с помощью Rhino.Commons через www.autumnofagile.net Стива Болена ... он создает приложение MVC с NHibernate, Windsor и Rhino.Commons ... это большая серия
Webjedi 13.12.2008 00:22:33
5 ОТВЕТОВ
РЕШЕНИЕ

Вы не должны заключать ISession в оператор using - смысл передачи ISessionBuilder в конструктор репозитория (внедрение зависимостей) заключается в том, что вызывающий код отвечает за управление жизненным циклом ISession. Оборачивая его в использование, Dispose () вызывается на ISession, и вы не сможете лениво загружать элементы объекта или сохранять его.

Мы делаем нечто подобное, просто передавая ISession в конструктор хранилища. Код г-на Палермо, насколько я понимаю, просто добавляет ленивую инициализацию ISession. Я не думаю, что это необходимо, потому что зачем вам создавать новый репозиторий, если вы не собираетесь его использовать?

37
16.12.2008 19:20:51

С ASP.Net MVC вы хотите убедиться, что срок действия сеанса поддерживается во время метода Action на вашем контроллере, так как после выхода из вашего контроллера все ваши данные должны быть собраны. Я не уверен, поможет ли этот механизм в этом.

Возможно, вы захотите взглянуть на S # arp Architechure, который представляет собой набор библиотек и руководство по созданию приложения ASP.Net MVC с использованием nHibernate. http://code.google.com/p/sharp-architecture/

10
13.12.2008 00:45:41
В настоящее время мы управляем этим временем жизни сеанса с помощью запроса начала и завершения запроса в global.asax (игнорируя css, js и т. Д.). Не нужно было украшать каждое действие инструкцией Unit Of Work.
Perhentian 17.09.2009 10:58:35
Сначала я использовал запрос на завершение, но затем, когда произошла критическая ошибка, запрос уже завершился, страница была обработана, и я не увидел чистого способа обработки ошибки, кроме отправки пользователя на общую страницу. Я предпочитаю явное закрытие сеанса (или как минимум фиксацию транзакции) при переходе от контроллера к представлению.
JoshBerke 17.09.2009 14:04:05

Я бы не стал открывать и закрывать сессии по каждому запросу данных в NHibernate. Я хотел бы использовать библиотеки Unit of Work, которые предлагают многие другие, или читать дальше. NHForge.org только начинается, и я полагаю, что есть некоторые практики по настройке NHibernate для общего веб-приложения.

Одним из «о, крутых моментов», которые я получил от NHibernate, было использование возможности ленивой загрузки коллекций во время разработки. Это был замечательный опыт - не нужно было выполнять все эти объединения, чтобы отобразить данные о каком-либо связанном объекте.

При закрытии сеанса, подобного этому, описанный выше сценарий будет невозможен.

Там может быть что-то, что происходит с транзакциями, а также.

1
13.12.2008 05:20:17

Это настройка, которую я использовал после более подробного изучения. Кажется, работает отлично и не имеет такой раздражающей привычки создавать ISession для статических файловых запросов, как большинство руководств там:

http://www.kevinwilliampang.com/2010/04/06/setting-up-asp-net-mvc-with-fluent-nhibernate-and-structuremap/

3
7.04.2010 16:01:11
Что именно является причиной того, что он открывает сеанс для статических запросов файлов?
Arnis Lapsa 10.09.2010 14:22:35
В большинстве решений используется обработчик запросов, который, поскольку IIS 7 обрабатывает все в интегрированном конвейере, обрабатывает запросы к статическим ресурсам, а не только запросы страниц. Поэтому обработчик раскручивает транзакцию / сеанс Nhibernate для каждого запроса, включая запросы к статическим ресурсам.
Ted 29.11.2011 21:49:40

Просто нашел чистое решение, использующее Unity для внедрения сеанса по запросу:

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

1
16.05.2010 20:01:10