web-dev-qa-db-ja.com

NestJs CQRS-共存しているTypeORMエンティティとの集合セットアップ

ここに公式の例があります

https://github.com/kamilmysliwiec/nest-cqrs-example

そして、私は3つの簡単な機能のために独自のものを作成しようとしました:

  • すべてのユーザーを取得する
  • IDで1人のユーザーを取得する
  • ユーザーを作成する

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を拡張するため、これは理にかなっています。残念ながら、公式の例では、集計とデータベースエンティティの扱い方を示していません。

更新:一時リポジトリへのリンクが存在しないため、削除されました。

5
Question3r

mergeObjectContextメソッドはAggregateRootインスタンスを引数として受け取る必要があります

const userAggregate = this.eventPublisher.mergeObjectContext(new User(createdUser.id);
0
Željko Šević