使用ES的聚合内的实体发生改变时如何将事件加入聚合根?

14-08-20 JasonMing
    

现在有一聚合A,里面包括了一个实体E(如下代码所示)

public class A extends AggregateRoot
{
  private final E entityInAggregate;

  public E getEntity()
  {
    return this.entityInAggregate;
  }

  public void Foo()
  {
    this.RaiseInternal(new FooEvent());
  }

  public void Handle(FooEvent e)
  {
    // 变更状态
  }
}

public class E extends Entity
{
  public void Bar()
  {
    // 这里应如何实现?
  }
}
<p>

根据Introduction to CQRS的做法,聚合根A是一个事件存储的媒介,任何改变将会Raise一个事件,并临时存储在聚合根内部的“未提交事件”列表当中。

我在实现时就遇到了这样一个上述文章没有描述到的情况,当在聚合内的实体E作出改变(E.Bar())的时候,理论上,E也应该Raise一个事件,然后处理。

但是这里我就有一些疑问:

1. 如果E能够Raise事件,事件将临时存储在A(聚合根)还是E(聚合内实体)中?

2.1. 如果E的事件是存储在E中,那么E的事件流就相对于A的独立了,但是一个聚合内的事件不是应该是一体的吗

2.2. 如果E的事件是存储在A中,我该如何实现?聚合方向是A聚合E,E内没有A的引用(实例引用和ID引用),那么我要通过什么方式把事件通知到A?

[该贴被JasonMing于2014-08-20 10:20修改过]

    

banq
2014-08-20 15:45

2014-08-20 10:19 "@JasonMing"的内容
如果E的事件是存储在A中,我该如何实现?聚合方向是A聚合E ...

对E的任何操作都是通过A进行的,外部不能跨越聚合根A直接调用其内部的属性和方法,这个属性可能是一个子对象如E。这是DDD聚合根设计原则。