领域事件的定义如下:
public class BalanceChangedEvent{public decimal delta;public BalanceChangedEvent(float delta) {this.delta = delta;}}
产生领域事件:
public void takeMoney(float amount) {if (canTakeMoney(amount) != "")throw new IllegalStateException();Money output = moneyInside.allocate(amount);moneyInside = moneyInside.substract(output);float amountWithCommission = caluculateAmountWithCommission(amount);moneyCharged += amountWithCommission;// 产生事件代码}
领域事件的结构遵循以下几点:
- 命名是过去式,类似
BalanceChangedEvent - 包含数据尽可能少
因为事件代表了过去发生的,所以命名应该包含过去式。所以,在我们的例子中命名为BalanceChangedEvent,而不是BalanceChange或者ChangeBalance。为了表明事件的细节,不能使用泛化的名称。另外,包含在事件中的数据尽可能地少。理论上只能包含外部可用的最小信息。
- 严禁在事件中使用领域类
- 使用原始数据类型
在构建事件时不能使用领域类:
class Person extends Entity{String firstName;String lastName;}class PersonChangedEvent{Person person;PersonChangedEvent(Person person){this.person= person;}}
这种方式包含了使领域事件包含不需要的信息。且增加了耦合性,将限界上下文内容暴露至外部。还有一个问题是实体的传递方式:
- id:当消费者知晓生产者
- 全部信息:生产者封闭
