【发布时间】:2019-02-28 20:25:16
【问题描述】:
公平警告:我不知道自己在做什么,所以即使提出这个问题也可能会出错。
我想更新一个简单对象(聚合)的状态,然后为 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?这就对了 似乎可以工作,但结果并未存储或发送到任何地方。
- 所以,这成为我的下一个问题:在执行 EventSourcing 之后 处理程序,是 Widget 的结果实例(不是投影) 存储、查看或发送到任何地方?
- 如果确实需要EventSourcingHandler,有什么办法可以避免 拥有我的业务逻辑的两个独立副本(一个在 EventSourcingHandler 和一个 EventHandler)?我真的很讨厌这个主意 不必在两个地方更新相同的业务逻辑。
我很欣赏该小组可以提供的任何清晰度。感谢您的帮助!
【问题讨论】:
-
@Allard,我希望您或您团队中的某个人会看到这一点。我很感激任何帮助。谢谢。
-
我可以向你保证,他团队中的某个人已经看到了。我希望我可以为你澄清一些事情@Jonathan M :-)