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

JasonMing 14-08-20
    

现在有一聚合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()
{
// 这里应如何实现?
}
}


根据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聚合根设计原则。