我相信您现在可以放心地将事件看作是支持非阻塞编程模型的小消息。您看到了future如何与主执行线程的交互,从而向我们的领域模型交付并行性。当你工作在完全重要的领域模型上时,你将会遇到很多这样的情景,而事件则帮助你去实现模型的可响应性。
我们来考虑一个事件,Debit,它会将钱从你的账户中取出。现在你的账户余额会被改变。如果您在数据库中维护着balance,事件将触发更新,从而改变balance。如果您还维护了聚合的内存副本,那么您还需要用目前账户中的新的余额来更新它。
一旦你的账户被取款了,你就会在你的智能手机上收到你的银行的一条信息,上面写着,通过现金存取,从你的账户取走了金额为x的现金。让我们把这个消息命名为- DebitOccurred 。事实上,这也是一个事件。
你认为这两种类型的交互在模型中有什么不同吗?表1.5解释了他们的不同:
表1.5 两种事件的解释。因为不同的特点,有时候Debit被称为命令,而 DebitOccurred则被称为事件。
Debit | DebitOccurred |
---|---|
对系统的全局状态有影响。相当于对聚合的写操作,在某种意义上它改变了一个帐户的余额 | 只是向感兴趣的订阅者发送的通知----在这种情况下,感兴趣的订阅者即是帐户持有人 |
这是系统中的一个对象在系统中发送的消息之前发送的消息 | 是在效果发生后由系统发送的消息 |
作为一个突变消息,通常由系统的一个处理程序处理 | 可以由多个参与方来处理,每个响应对消息的响应都不同 |
如果违反了某些约束,会失败 | 不能失败因为相关的效应已经在系统中发生了 |
我们称Debit为一个命令, DebitOccurred是一个事件。它们都是由模型生成和处理的消息,但是它们在语义上的差别是很微妙的。请注意这些差异,因为当我们谈论领域模型架构时,您将会以非常不同的方式处理命令和事件。