我一定是做错什么了。
我有一个非常简单的Axon应用程序,它有两个简单的函数:创建person &更改person的名称。
所以我有个人实体:
@Entity
@Data
@NoArgsConstructor
public class Person {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String name;
}我的PersonAggregate:
@Aggregate
@Data
@NoArgsConstructor
public class PersonAggregate {
@AggregateIdentifier
private UUID id;
private String name;
@CommandHandler
public PersonAggregate(CreatePersonCommand command) {
apply(new PersonCreatedEvent(
command.getId(),
command.getName()
));
}
@EventSourcingHandler
public void on(PersonCreatedEvent event) {
this.id = event.getId();
this.name = event.getName();
}
@CommandHandler
public void handle(ChangeNameCommand command) {
apply(
new NameChangedEvent(
command.getId(),
command.getName()
)
);
}
@EventSourcingHandler
public void on(NameChangedEvent event) {
this.name = event.getName();
}
}这是我的ChangeNameCommand:
@Data
@NoArgsConstructor
@AllArgsConstructor
public class ChangeNameCommand {
@TargetAggregateIdentifier
private UUID id;
private String name;
}这是我的NameChangedEvent:
@Value
public class NameChangedEvent {
private final UUID id;
private final String name;
}和保管所:
@Repository
public interface PersonCommandRepository extends JpaRepository<Person, Long> {
}问题是我不知道如何构造事件处理程序
@EventHandler
public void changeName(NameChangedEvent event) {
Optional<Person> opt = null;//this.personCommandRepository.findById(event.getId());
if (opt.isPresent()) {
Person person = opt.get();
person.setName(event.getName());
this.personCommandRepository.save(person); //Does'nt this defeat the purpose of Event Sourcing? A single point of truth?
}而且,在我的控制器里,我有一个很大的问题,在评论中:
@RequestMapping(value = "/rename", method = RequestMethod.POST)
public ResponseEntity<?> changeName(@RequestParam("id") Long id, @RequestParam("name")String name){
//1. Which Id do we pass in here? Aggregate or Entity?
//this.commandGateway.send(new ChangeNameCommand(id,name));
return new ResponseEntity<String>("Renamed", HttpStatus.OK);
}
}发布于 2020-03-20 09:36:26
我觉得您仍然在将命令模型和查询模型的想法混合在一起。
命令模型通常是聚合(或多个),它只处理意图更改某些状态的请求。因此,这些意图请求,即命令消息,是针对聚合/命令模型的唯一操作。反之亦然,如果您需要对某个人进行更改,这意味着您要向PersonAggregate发送一个标记该意图的命令。
另一方面,查询模型只负责回答针对应用程序的问题。如果需要知道某个人的状态,这意味着您向能够返回您共享的Person实体的组件发送一个查询。
回到你描述的“问题”:
在AxonIQ的网页上有一个描述所有主要原则的建筑概念部分。还有一个关于CQRS的,可能会有帮助。可能有助于阅读这些信息;非常肯定的是,其中的许多内容将解决很多问题。:-)
希望这能有所帮助!
https://stackoverflow.com/questions/60755149
复制相似问题