public void JoinGame(UserId userId, GameId gameId, Color?color) { var user = _unitOfWork.WithUserTransaction(tran => { var user = _userRepository.FindById(userId); return(tran.CommitWith(user)); }); _unitOfWork.WithGameTransaction(tran => { var game = _gameRepository.FindByIdOrNull(gameId); if (game is null) { throw new ManualValidationException("Game not found"); } var idPool = _idGenerator.ReservePool(); var userInfo = new UserInfo(user.Id, user.Username, user.Rank); var player = _gameFactory.BuildPlayer(idPool, userInfo, color ?? GetRemainingColor(game)); game.JoinGame(player, player.CreatedAt); _gameRepository.Save(game); tran.Commit(); }); }