public DataResultUserCreateResult CreateUser(string username, string password, string email, string passwordQuestion, string passwordAnswer, string activateFormVirtualPath)
        {
            DataResultUserCreateResult result;
            EmailAttribute emailDataAnnotations = new EmailAttribute();
            if (!emailDataAnnotations.IsValid(email))
            {
                //result = new DataResultUserCreateResult(new CreatedAccountResultModel(MembershipCreateStatus.InvalidEmail));
                result = new DataResultUserCreateResult()
                {
                    IsValid = true,
                    MessageType = DataResultMessageType.Error,
                    Data = new CreatedAccountResultModel(MembershipCreateStatus.InvalidEmail)
                };
            }
            else
            {
                if (this.ValidatePasswordStrength(password))
                {

                    using (TransactionScope trans = this.TransactionScopeCreate())
                    {
                        result = this._dal.CreateUser(username, password, email, passwordQuestion, passwordAnswer, activateFormVirtualPath);

                        if (result.Data.CreateStatus == MembershipCreateStatus.Success)
                        {
                            MembershipUserWrapper newUser = _dal.GetUserByName(username, false).Data;

                            IRoleAdminBL _roleBl = new RoleAdminBL();
                            DataResultBoolean newUserRole = _roleBl.AddToRoles(newUser.UserName, new string[1] { SiteRoles.Guest.ToString() });
                            _roleBl.Dispose();

                            ProfileBL _profileBL = new ProfileBL();
                            UserProfileModel usrProfile = _profileBL.Create(username).Data;
                            _profileBL.Dispose();

                            ITokenTemporaryPersistenceBL<MembershipUserWrapper> _tokenServices = new TokenTemporaryPersistenceBL<MembershipUserWrapper>();
                            TokenTemporaryPersistenceServiceItem<MembershipUserWrapper> token = new TokenTemporaryPersistenceServiceItem<MembershipUserWrapper>(newUser);
                            _tokenServices.Insert(token);
                            result.Data.ActivateUserToken = token.Token;
                            _tokenServices.Dispose();

                            if (newUserRole.Data)
                            {
                                MailMessage mail = new MailMessage();
                                mail.From = new MailAddress(ApplicationConfiguration.MailingSettingsSection.SupportTeamEmailAddress);
                                mail.Bcc.Add(new MailAddress(newUser.Email));
                                mail.Subject = string.Format(AccountResources.CreateNewAccount_EmailSubject, ApplicationConfiguration.DomainInfoSettingsSection.DomainName);
                                mail.Body = string.Format(AccountResources.CreateNewAccount_EmailBody,
                                                                            ApplicationConfiguration.DomainInfoSettingsSection.DomainName,
                                                                            new Uri(string.Format("{0}://{1}{2}/{3}",
                                                                                                                    ApplicationConfiguration.DomainInfoSettingsSection.SecurityProtocol,
                                                                                                                    ApplicationConfiguration.DomainInfoSettingsSection.DomainName,
                                                                                                                    activateFormVirtualPath.ToString(),
                                                                                                                    result.Data.ActivateUserToken)));

                                using (ISmtpClient smtp = DependencyFactory.Resolve<ISmtpClient>())
                                {
                                    smtp.Send(mail);
                                }

                                trans.Complete();
                            }
                            else
                            {
                                trans.Dispose();
                            }
                        }
                        else
                        {
                            trans.Dispose();
                        }
                    }
                }
                else
                {
                    result = new DataResultUserCreateResult()
                    {
                        IsValid = true,
                        MessageType = DataResultMessageType.Error,
                        Data = new CreatedAccountResultModel(MembershipCreateStatus.InvalidPassword)
                    };

                }
            }
            return result;
        }
        public DataResultUserCantAccess CantAccessYourAccount(string activateFormVirtualPath, string email)
        {
            ITokenTemporaryPersistenceBL<MembershipUserWrapper> tokenServices = null;

            DataResultUserCantAccess dalResult;
            try
            {
                using (TransactionScope trans = this.TransactionScopeCreate())
                {
                    dalResult = this._dal.CantAccessYourAccount(activateFormVirtualPath, email);
                    if (dalResult.IsValid)
                    {
                        tokenServices = new TokenTemporaryPersistenceBL<MembershipUserWrapper>();
                        TokenTemporaryPersistenceServiceItem<MembershipUserWrapper> token =
                            new TokenTemporaryPersistenceServiceItem<MembershipUserWrapper>(dalResult.Data.User);
                        tokenServices.Insert(token);
                        dalResult.Data.ChangePasswordToken = token.Token;

                        MailMessage mail = new MailMessage();
                        mail.From = new MailAddress(ApplicationConfiguration.MailingSettingsSection.SupportTeamEmailAddress);
                        mail.Bcc.Add(new MailAddress(dalResult.Data.User.Email));
                        mail.Subject = string.Format("{0}: {1}",
                                                    ApplicationConfiguration.DomainInfoSettingsSection.DomainName,
                                                    AccountResources.CantAccessYourAccount_EmailTitle);
                        mail.Body = string.Format(
                            AccountResources.CantAccessYourAccount_Email,
                            new Uri(string.Format("{0}://{1}{2}/{3}",
                                                ApplicationConfiguration.DomainInfoSettingsSection.SecurityProtocol,
                                                ApplicationConfiguration.DomainInfoSettingsSection.DomainName,
                                                activateFormVirtualPath,
                                                dalResult.Data.ChangePasswordToken.ToString())),
                            ApplicationConfiguration.DomainInfoSettingsSection.DomainName);

                        using (ISmtpClient smtp = DependencyFactory.Resolve<ISmtpClient>())
                        {
                            // Do not use SendAsync -> otherwise transaction could commit without sending mail
                            smtp.Send(mail);
                        }

                        trans.Complete();
                    }
                    return dalResult;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                if (tokenServices != null)
                {
                    tokenServices.Dispose();
                }
            }
        }
        public DataResultUserCantAccess CantAccessYourAccount(string activateFormVirtualPath, string email)
        {
            ITokenTemporaryPersistenceBL<MembershipUserWrapper> tokenServices = null;

            DataResultUserCantAccess dalResult;
            try
            {
                using (TransactionScope trans = this.TransactionScopeCreate())
                {
                    dalResult = this._dal.CantAccessYourAccount(activateFormVirtualPath, email);
                    if (dalResult.IsValid)
                    {
                        tokenServices = new TokenTemporaryPersistenceBL<MembershipUserWrapper>();
                        TokenTemporaryPersistenceServiceItem<MembershipUserWrapper> token = new TokenTemporaryPersistenceServiceItem<MembershipUserWrapper>(dalResult.Data.User);
                        tokenServices.Insert(token);
                        dalResult.Data.ChangePasswordToken = token.Token;

                        MailingHelper.Send(delegate()
                        {
                            MailMessage mail = new MailMessage();
                            mail.From = new MailAddress(MailingHelper.MailingConfig.SupportTeamEmailAddress);
                            mail.Bcc.Add(new MailAddress(dalResult.Data.User.Email));
                            mail.Subject = AccountResources.CantAccessYourAccount_EmailTitle;
                            mail.Body = string.Format(AccountResources.CantAccessYourAccount_Email,
                                                                        new Uri(string.Format("{0}://{1}/{2}/{3}",
                                                                                                            ApplicationConfiguration.DomainInfoSettingsSection.SecurityProtocol,
                                                                                                            ApplicationConfiguration.DomainInfoSettingsSection.DomainName,
                                                                                                            activateFormVirtualPath,
                                                                                                            dalResult.Data.ChangePasswordToken.ToString())),
                                                                        MailingHelper.DomainConfig.DomainName);
                            return mail;
                        });

                        trans.Complete();
                    }
                    return dalResult;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                if (tokenServices != null)
                {
                    tokenServices.Dispose();
                }
            }
        }