private RegisterCommand CreateRegisterCommand(string[] commandComponenets)
        {
            if (commandComponenets.Length != RegisterCommandParametersCount)
            {
                throw new InvalidOperationException(RegisterCommandParametersCountErrorMessage);
            }

            var username = commandComponenets[1];
            if (username.Length < UsernameMinLength)
            {
                throw new ArgumentOutOfRangeException(UsernameLengthErrorMessage);
            }

            var email = commandComponenets[2];
            if (email.Length < EmailMinLength)
            {
                throw new ArgumentOutOfRangeException(EmailLengthErrorMessage);
            }

            var password = commandComponenets[3];
            var confirmPassword = commandComponenets[4];
            if (!password.Equals(confirmPassword))
            {
                throw new ArgumentOutOfRangeException(ConfirmPasswordMismatchErrorMessage);
            }

            var command = new RegisterCommand(username, email, password, confirmPassword);

            return command;
        }
        private async Task<string> ExecuteRegisterCommand(RegisterCommand registerCommand)
        {
            var registerationContent = new FormUrlEncodedContent(new[]
            {
                new KeyValuePair<string, string>("email", registerCommand.Email),
                new KeyValuePair<string, string>("username", registerCommand.Username),
                new KeyValuePair<string, string>("password", registerCommand.Password),
                new KeyValuePair<string, string>("confirmPassword", registerCommand.ConfirmPassword)
            });

            var response = await this.Requester.HttpClient.PostAsync(RegisterEndpoint, registerationContent);

            if (!response.IsSuccessStatusCode)
            {
                throw ApiException.Create(response);
            }

            return SuccessfullRegistrationMessage;
        }
        public ActionResult Register(RegisterViewModel register, Member existingMemberRecord, Cart cart)
        {
            if(this.ModelState.IsValid)
            {
                RegisterCommand command = new RegisterCommand(existingMemberRecord.Guid, register.RegisterEmail, register.Password);
                this._commandDispatcher.Dispatch(command);

                Member member = this._queryDispatcher.Dispatch<Member, GetMemberByEmailQuery>(new GetMemberByEmailQuery(register.RegisterEmail));

                // TODO: Update carts memberId
                var result = this._loginProvider.Login(this.Request.GetOwinContext().Authentication, register.RegisterEmail, register.Password, false);

                if (result.Successful)
                {
                    if (cart != null && cart.MemberId != result.Member.Guid)
                    {
                        // convert cart
                        this._commandDispatcher.Dispatch(new ChangeCartsMemberGuidCommand(cart, result.Member.Guid));
                    }

                    if (string.IsNullOrEmpty(register.ReturnUrl))
                    {
                        return this.RedirectToRoute(Routes.Home);
                    }
                    else
                    {
                        return this.Redirect(register.ReturnUrl);
                    }
                }

            }

            return this.Register(register.ReturnUrl);
        }