ASP.NET MVC 2, Nhibernate и транзакции по уровням - PullRequest
3 голосов
/ 27 марта 2011

Я создаю решение в ASP.NET MVC 2, NHibernate и DDD.Я использую модель типа Half CQRS.

Контроллер ASP.NET отправляет проверенные сообщения на уровень обслуживания, который обновляет состояние объекта Domain.У меня есть «События» в доменной рассылке, которые затем перехватываются «обработчиками событий», которые воздействуют на них.Каждый из этих обработчиков событий имеет доступ к уровню репозитория и может зафиксировать состояние объекта домена.

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

Обработчик событий также может изменять состояние объекта, создавая тем самым новый набор событий.

Как я могу убедиться, что все операции с базой данных, которыепроисходят во время одного запроса asp.net внутри одной транзакции.Я читал некоторые блоги (например, Кевин Уильямс , Мэтт Врок и Дэйви Брайон ) и получил информацию о том, как запустить объект Session в Begin и EndЗапрос (снова я буду использовать Структурную карту здесь), но не уверен, как транзакция поддерживается.Это усугублялось тем фактом, что начальный и конечный запросы могут вызываться в разных потоках.

Мой класс репозитория принимает NHibernate ISession в своем параметре.Если я создаю ISession как Hybrid Scope (StructureMap), это гарантирует, что во время запроса параметр ISession, передаваемый StructrueMap, останется таким же.

Пожалуйста, сообщите, а также дайте мне знать, если мой вопрос неясен.

Спасибо,

Мар

Мар

Ответы [ 2 ]

1 голос
/ 27 марта 2011

Вы можете рассмотреть возможность реализации Unit Of Work pattern для каждого веб-запроса. Единица работы создает сеанс NHibernate, а также обрабатывает транзакции. В Интернете есть несколько реализаций, таких как this и this .

0 голосов
/ 27 марта 2011

в дополнение к ответу WorldIsRound - вы не указали в своем описании, где транзакции создаются и фиксируются (из вашего объяснения я предполагаю, что это должно быть где-то на уровне сервиса).
Я знаю, что есть инструментыэто будет управлять вашими сессиями и, возможно, вашими транзакциями, но, по моему мнению, вы хотите явно контролировать свои транзакции.
Я также использую шаблон UOW в своих проектах, чтобы создать объект Session в событии Begin_Requestи затем я использую этот объект для создания транзакций, когда они мне нужны.
Опять же, это только мое мнение, но я думаю, что вы должны иметь полный контроль над открытием и закрытием транзакций.
Удачи

...