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

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

5 ответов

Решение

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

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

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

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам