领域事件的定义如下:
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:当消费者知晓生产者
- 全部信息:生产者封闭