Подтвердить что ты не робот

Управление сеансом 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/ factory? Я слышал о "Единице работы" и создании сеанса для каждого веб-запроса, а также в конце. Из того, что я могу сказать, моя текущая реализация не делает ничего из этого. В основном он полагается на репозиторий, чтобы захватить сеанс из сеанса factory и использовать его для запуска запросов.

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

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

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

Закрыв сеанс следующим образом, описанный выше сценарий будет невозможным.

Возможно, что-то происходит с транзакциями.