领域事件的定义如下:

    1. public class BalanceChangedEvent{
    2. public decimal delta;
    3. public BalanceChangedEvent(float delta) {
    4. this.delta = delta;
    5. }
    6. }

    产生领域事件:

    1. public void takeMoney(float amount) {
    2. if (canTakeMoney(amount) != "")
    3. throw new IllegalStateException();
    4. Money output = moneyInside.allocate(amount);
    5. moneyInside = moneyInside.substract(output);
    6. float amountWithCommission = caluculateAmountWithCommission(amount);
    7. moneyCharged += amountWithCommission;
    8. // 产生事件代码
    9. }

    领域事件的结构遵循以下几点:

    • 命名是过去式,类似BalanceChangedEvent
    • 包含数据尽可能少

    因为事件代表了过去发生的,所以命名应该包含过去式。所以,在我们的例子中命名为BalanceChangedEvent,而不是BalanceChange或者ChangeBalance。为了表明事件的细节,不能使用泛化的名称。另外,包含在事件中的数据尽可能地少。理论上只能包含外部可用的最小信息。

    • 严禁在事件中使用领域类
    • 使用原始数据类型

    在构建事件时不能使用领域类:

    1. class Person extends Entity{
    2. String firstName;
    3. String lastName;
    4. }
    5. class PersonChangedEvent{
    6. Person person;
    7. PersonChangedEvent(Person person){
    8. this.person= person;
    9. }
    10. }

    这种方式包含了使领域事件包含不需要的信息。且增加了耦合性,将限界上下文内容暴露至外部。还有一个问题是实体的传递方式:

    • id:当消费者知晓生产者
    • 全部信息:生产者封闭