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