我一直试图在udi dahan描述的新项目中实现这种模式.
我喜欢if的想法,但我还不确定它应该在什么情况下应用(这个东西的新东西……).
例如,假设我有一个OnUserCreated事件.我希望其中一位处理程序向用户发送确认电子邮件.但是,如果事件被触发,电子邮件将被发送,然后提交事务时出错并且数据永远不会保存到数据库中.这种模式适用于这种情况吗?我读过人们说不,但是我过去做过的一些项目实际上是这样做的.或者这是我应该只用于加载和更新其他实体的东西……另一方面,我读了有人说,操作所需的关联实体应该已经加载,所以我不应该从数据库加载它们事件.
解决方法
它当然取决于您选择如何实施您的系统.
您可以在此处考虑多个选项:
1.两阶段提交
在进行两阶段提交时,基本上每个处理程序都包含3个方法:一个用于准备,一个用于提交,一个用于回滚.
对于所有事件处理程序,首先调用Prepare.如果这些都没有报告问题,则调用所有处理程序的Commit()方法.如果其中任何一个报告问题 – 尽管Prepare()调用没有报告任何问题 – 那么对于其Commit()已经执行的所有处理程序,您调用它们的Rollback()方法.
2.内部和外部事件处理程序
另一种选择是分离事件处理程序.您可以发布一个事件,例如UserCreated,它由首先参与事务的事件处理程序处理.事件作为事务的一部分存储在DB中.然后,您可以拥有外部事件处理程序,它们只对已存储在数据库中的事件做出反应 – 例如您的电子邮件发件人.这些只能在提交初始事务后调用.
我相信你可以想出更多方法来处理你的具体情况.