提醒:我并不知道我在做什么,所以即使是问这个问题也可能会出错。
我想要更新一个简单对象(聚合)的状态,并且向UI提供更改后的对象投影。这是我的聚合对象(命令处理程序存在,但此处未显示)。
@Aggregate
public class Widget {
@AggregateIdentifier
private String id;
private String color;
...
@EventSourcingHandler
public void on(ChangeColorEvt evt) {
color = evt.getColor();
}
...
}
...这是我的预测:
public class WidgetProjection {
private final EntityManager entityManager;
private final QueryUpdateEmitter queryUpdateEmitter;
...
@EventHandler
public void on(ChangeColorEvt evt) {
ProjectedWidget projection = entityManager.find(ProjectedWidget.class, evt.getId());
projection.setColor(evt.getColor());
queryUpdateEmitter.emit(FetchWidget.class, query -> evt.getId().startsWith(query.getFilter().getIdStartsWith()), projection);
}
...
}
QueryHandler的作用是寻找实例并将其返回,符合预期。
以下是我的问题:
- 为什么我需要在聚合中使用EventSourcingHandler?它似乎执行了工作,但结果没有被存储或发送到任何地方。
- 那么,接下来的问题是:在执行EventSourcingHandler之后,Widget的实例(而不是projection)是否被存储、查看或发送到任何地方?
- 如果确实需要EventSourcingHandler,有没有办法避免在两个独立的业务逻辑副本(一个在EventSourcingHandler中,一个在EventHandler中)中更新相同的业务逻辑?我非常讨厌在两个地方更新相同的业务逻辑的想法。
感谢大家提供的任何澄清。感谢您的帮助!