我对事件溯源很新,但据我所了解,当我们有一个命令用例时,在内存中实例化聚合体,从事件存储库中应用事件以使其处于正确的状态,进行适当的更改,然后将这些更改存储回事件存储库。我们还有一个读取模型存储,它最终会通过这些更改进行更新。
在我的情况下,我有一个CreateUserUseCase
(这是一个命令用例),我想首先检查用户是否已经存在,以及用户名是否已经被使用。例如,像这样:
const userAlreadyExists = await this.userRepo.exists(email);
if (userAlreadyExists) {
return new EmailAlreadyExistsError(email);
}
const alreadyCreatedUserByUserName = await this.userRepo
.getUserByUserName(username);
if (alreadyCreatedUserByUserName) {
return new UsernameTakenError(username);
}
const user = new User(username, password, email);
await this.userRepo.save(user);
因此,对于
save
方法,我将使用事件存储并将未提交的事件附加到其中。但是对于exists
和getUserByUserName
方法呢?一方面,我想进行特定的查询,因此可以使用我的读取模型存储获取所需的数据,但另一方面,这与CQRS存在矛盾。那么我们在这些情况下该怎么做?我们是否以某种方式对事件存储执行查询?以何种方式执行此操作?谢谢!