域事件应该在事务内部还是外部引发?

And*_*cus 19 architecture domain-driven-design domain-events

在我们的应用程序中,我们在域模型中发生更改时引发域事件.事件处理程序执行的某些任务必须在引发事件时使用的同一事务中完成,其他任务必须在此事务之外执行.

例如,

将Orderline添加到Order实体时,会引发OrderLineAdded域事件,一个域事件会更改域模型的状态(因此必须在同一事务中执行),然后在事务完成时必须更新UI.

你会如何解决这个问题?

  1. 提升两个事件,一个在事务内,一个在事务外部.
  2. 在事务内部引发事件,但是使用事件处理程序发送Async请求来更新UI?

选项1似乎令人困惑,因为事件名称必须以某种方式传达它们进出事务,但是对于域事件的选项2处理程序必须始终假定它们是在事务内同步调用的.

也许有更好的方法?

Szy*_*ega 17

我有类似的问题.域模型是发布事件(使用Udi Dahan 在此描述的技术).然后我意识到,即使出现问题并且稍后回滚事务,也会调用与UI相关的处理程序.

为了解决这个问题,我向系统引入了另一个角色,另一种是事件处理程序.我有ITransactionalEventHadnelerINonTransactionalEventHandler.前者在DomainEvents.Publish()方法中立即同步调用.一旦提交了事务(使用System.Transactions挂钩),后者就会排队等待调用.该解决方案工作正常,非常易读且易于维护.