Как стать автором
Обновить

Внедрение зависимости и реализация единицы работы с помощью Castle Windsor и NHibernate

Время на прочтение15 мин
Количество просмотров4.9K
Всего голосов 12: ↑10 и ↓2+8
Комментарии11

Комментарии 11

Статья банально уже просто не актуальна. У windstor есть проблемы с миграцией на .net standard. Было бы интересно увидеть пример с asp.net core.
Реализация хибера для однопоточной модели, т.к. сессия между потоками не работает.
Это кстати большая проблема, когда вы пытаетесь писать асинхронный код.
Видимо, статья писалась без учета асинхронности. При ее использовании мы можем закончить запрос и соответственно пытаться сделать commit или rollback транзакции на другом потоке (не на том на котором начинали), где поле _current UnitOfWork не будет заполнено.

Кстати, автор один из разработчиков aspnetboilerplate и unit of work там сделан похожим образом, но исправлена проблема с асинхронностью. Они используют AsyncLocal.

Также, так как в статье все-равно используется Castle Windsor, можно зарегистрировать UnitOfWork со scoped lifestyle — но под капотом используется Logical Call Context, а люди на stackoverflow говорят, что использование AsyncLocal предпочтительнее.
AsyncLocal в 5 версии хибера есть из коробки, кстати говоря =)
И даже без проблем бэкпортится в 4, тупым копированием класса.
А расскажите подробнее, как в этом случае у NHibernate будет unit of work работать и как можно получать доступ к сессии и транзакции из разных потоков.
Не знаю насчет UoW, ибо в реальной жизни его ни разу не видел в классическом виде.
А доступ к сессии получается как обычно, через Factory.GetCurrentSession или OpenSession. Конкретно асинхронный поток оно ловит корректно и отдает нужную сессию. Простые попытки из разных тредов стучаться — всё так же валят всё =)
Понятно — вы про передачу NHibernate сессии между потоками средствами NHibernate. Хорошо, что NHibernate начал поддерживать эту возможность из коробки, но если реализовать unit of work как описано в статье и учесть правки из моего комментария, то эта поддержка будет не нужна, между потоками будет передаваться объект unit of work содержащий сессию NHibernate, плюс вы получите возможность хранить и передавать между потоками текущую транзакцию.
И снова речь о создании личшнего слоя Repository. Зачем? Ведь, к примеру у EF функции репозитория довольно хорошо реализует DbSet. C NHibernate не работал, но уверен и у него что-то такое есть.
То же самое. Любая современная (не «микро-») ORM реализует в себе Repository, Query object, Specification, Unit of Work, и т.д.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий