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

在我们的应用程序中,我们在域模型中发生更改时引发域事件。事件处理程序执行的某些任务必须在引发事件时使用的同一事务中完成,其他任务必须在此事务之外执行。 例如, 将Orderline添加到Order实体时,会引发OrderLineAdded域事件,一个域事件会更改域模型的状态(因此必须在同一事务中执行),然后在事务完成时必须更新UI。 你会如何解决这个问题? 提升两个事件,一个在事务内,一个在事务外部。 在事务内部引发事件,但是使用事件处理程序发送Async请求来更新UI? 选项1似乎令人困惑,因为事件名称必须以某种方式传达它们进出事务,但是对于域事件的选项2处理程序必须始终假定它们是在事务内同步调用的。 也许有更好的方法?     
已邀请:
我有类似的问题。域模型是发布事件(使用Udi Dahan在此描述的技术)。然后我意识到,即使出现问题并且稍后回滚事务,也会调用与UI相关的处理程序。 为了解决这个问题,我向系统引入了另一个角色,另一种是事件处理程序。我有
ITransactionalEventHadneler
INonTransactionalEventHandler
。前者在
DomainEvents.Publish()
方法中立即同步调用。一旦提交了事务(使用System.Transactions挂钩),后者就会排队等待调用。该解决方案工作正常,非常易读且易于维护。     
我认为这两种方法都可以很好,只需在代码的每个部分都坚持使用相同的方法: 您需要两个(或更多)事件处理程序,一个用于事务范围内的域模型的上下文,另一个用于辅助上下文的其他(如UI)。您的域代码不应该关心代码的其他部分,只是通知他们有关域数据的更改。 您的域代码事件处理程序方法可以将异步事件发送到UI或其他模块。域事件应该是同步的,否则您需要两阶段提交来保持事务性。 我个人更喜欢选项2,因为它使域代码更加清晰,并且通过使用异步通信,核心和其他模块将被解耦,因此外部模块中的问题不会妨碍核心的工作。另一方面,可能存在选项1更有利的情况。     

要回复问题请先登录注册