public static User Create(Email email, IUserIdGenerator userIdGenerator, IUserUniqueChecker userUniqueChecker, IPasswordGenerator passwordGenerator, IPasswordHasher passwordHasher, CancellationToken cancellationToken) { if (!email.IsValid) { throw new EmailNotValidException(email); } bool unique = userUniqueChecker.CheckAsync(email, cancellationToken).GetAwaiter().GetResult(); if (!unique) { throw new UserAlreadyExistException(email); } UserId userId = userIdGenerator.Generate(); Password password = passwordGenerator.Generate(); PasswordHash passwordHash = passwordHasher.Hash(password); var user = new User(userId, email, passwordHash, DateTime.UtcNow); var userCreatedEvent = new UserCreatedEvent(user, password); user.AddDomainEvent(userCreatedEvent); return(user); }