Должны ли события предметной области возникать внутри или вне транзакции?

В нашем приложении мы вызываем события домена, когда что-то изменяется в модели домена. Некоторые задачи, которые выполняются обработчиками событий, должны выполняться в рамках той же транзакции, которая использовалась при возникновении события, другие задачи должны выполняться вне этой транзакции.

Например,

Когда строка заказа является добавлен в сущность Order, возникает событие домена OrderLineAdded, одно событие предметной области изменяет состояние модели предметной области (поэтому оно должно выполняться в одной транзакции), затем, когда транзакция завершена, пользовательский интерфейс должен быть обновлен.

Как бы вы подойти к этой проблеме?

  1. Вызвать два события, один внутри транзакции, а другой вне транзакции.
  2. Вызвать событие внутри транзакции, но использовать обработчик событий для отправки запроса Async для обновления пользовательского интерфейса?

Вариант 1 кажется сбивающим с толку, поскольку имена событий должны каким-то образом указывать, что они находятся в транзакции или вне ее, но с вариантом 2 обработчики доменного события всегда должны предполагать, что они вызываются синхронно из транзакции.

Возможно, есть лучший подход?

19
задан Andronicus 14 January 2011 в 13:50
поделиться