Управление сессиями NHibernate в ASP.NET MVC - PullRequest
28 голосов
/ 13 декабря 2008

В настоящее время я играю с классом 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 ]

37 голосов
/ 16 декабря 2008

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

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

10 голосов
/ 13 декабря 2008

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

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

3 голосов
/ 07 апреля 2010

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

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

1 голос
/ 17 мая 2010

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

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

1 голос
/ 13 декабря 2008

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...