首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Axon -聚合的唯一Id是否等于/是否与我的实体的Id相同?

Axon -聚合的唯一Id是否等于/是否与我的实体的Id相同?
EN

Stack Overflow用户
提问于 2020-03-19 10:22:44
回答 1查看 625关注 0票数 0

我一定是做错什么了。

我有一个非常简单的Axon应用程序,它有两个简单的函数:创建person &更改person的名称。

所以我有个人实体:

代码语言:javascript
复制
@Entity
@Data
@NoArgsConstructor
public class Person {    
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private String name;
}

我的PersonAggregate:

代码语言:javascript
复制
@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:

代码语言:javascript
复制
@Data
@NoArgsConstructor
@AllArgsConstructor
public class ChangeNameCommand {
    @TargetAggregateIdentifier
     private UUID id;
     private String name;    
}

这是我的NameChangedEvent:

代码语言:javascript
复制
@Value
public class NameChangedEvent {
    private final UUID id;
    private final String name;
}

和保管所:

代码语言:javascript
复制
@Repository
public interface PersonCommandRepository extends JpaRepository<Person, Long> {
}

问题是我不知道如何构造事件处理程序

代码语言:javascript
复制
@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?
    }

而且,在我的控制器里,我有一个很大的问题,在评论中:

代码语言:javascript
复制
   @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);
    }

}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-20 09:36:26

我觉得您仍然在将命令模型和查询模型的想法混合在一起。

命令模型通常是聚合(或多个),它只处理意图更改某些状态请求。因此,这些意图请求,即命令消息,是针对聚合/命令模型的唯一操作。反之亦然,如果您需要对某个人进行更改,这意味着您要向PersonAggregate发送一个标记该意图的命令。

另一方面,查询模型只负责回答针对应用程序的问题。如果需要知道某个人的状态,这意味着您向能够返回您共享的Person实体的组件发送一个查询。

回到你描述的“问题”:

  1. “这难道不辜负事件源的目的吗?一个单一的事实?”:事件源是一个特定的概念,用于从events 本身发布的中重新补充命令模型。因此,使用events仅仅意味着您要确保不仅通过事件创建查询模型,而且还要确保您的命令模型。因此,你这样做是在强化一个单一的真理来源。因此,使用事件更新查询模型并不会违背ES的目的。
  2. “我们在这里传递哪一个Id ?集合还是实体?”:当你有疑问时,试着找出你想要达到的目标。你在要求提供信息吗?然后是针对您的查询模型的查询。是否打算将某种状态转换为模型?然后向命令模型发送一个命令。在这种情况下,您想要更改一个人的名字。因此,可以向聚合/命令模型发送一个命令。

在AxonIQ的网页上有一个描述所有主要原则的建筑概念部分。还有一个关于CQRS的,可能会有帮助。可能有助于阅读这些信息;非常肯定的是,其中的许多内容将解决很多问题。:-)

希望这能有所帮助!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60755149

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档