ここに公式の例があります
https://github.com/kamilmysliwiec/nest-cqrs-example
そして、私は3つの簡単な機能のために独自のものを作成しようとしました:
TypeORMを使用していて、基本的なユーザーエンティティがあります。公式サンプルコードに基づいて、ユーザーを作成するためのコマンドハンドラーを作成しました(create.user.handler.ts
):
@CommandHandler(CreateUserCommand)
export class CreateUserHandler implements ICommandHandler<CreateUserCommand> {
constructor(
private readonly usersRepository: UsersRepository,
private readonly eventPublisher: EventPublisher,
) {}
public async execute(command: CreateUserCommand): Promise<void> {
const createdUser: User = await this.usersRepository.createUser(
command.username,
command.password,
);
// const userAggregate: UserAggregate = this.eventPublisher.mergeObjectContext(
// createdUser,
// );
// userAggregate.doSomething(createdUser);
// userAggregate.commit();
}
}
新しいユーザーエンティティをデータベースに永続化するだけです。しかし、今のところ得られなかったのは、ユーザー集約をどうするかです。オブジェクトコンテキストをマージするときに、作成したユーザーエンティティを渡すことができません。さらに、どのロジックを集約で処理する必要があるのかわかりません。したがって、このユーザー集計(user.model.ts
):
export class User extends AggregateRoot {
constructor(private readonly id: string) {
super();
}
public doSomething(user: UserEntity): void {
// do something here?
this.apply(new UserCreatedEvent(user));
}
}
イベントを発生させ、新しいユーザーが作成され、それを履歴にプッシュできることを知っています。しかし、それが責任があるのはそれだけですか?
では、ユーザー集計をセットアップしてユーザーハンドラーを正しく作成するにはどうすればよいでしょうか。
作成したエンティティを渡すと、次のようなエラーが発生します
タイプ「User」の引数は、タイプ「AggregateRoot」のパラメーターに割り当てることができません。タイプ 'User'には、タイプ 'AggregateRoot'の次のプロパティがありません:autoCommit、publish、commit、uncommit、および7 more.ts(2345)
typeORMエンティティがBaseEntity
を拡張し、集計がAggregateRoot
を拡張するため、これは理にかなっています。残念ながら、公式の例では、集計とデータベースエンティティの扱い方を示していません。
更新:一時リポジトリへのリンクが存在しないため、削除されました。
mergeObjectContext
メソッドはAggregateRootインスタンスを引数として受け取る必要があります
const userAggregate = this.eventPublisher.mergeObjectContext(new User(createdUser.id);