Предоставление пользовательских функций базы данных для настраиваемого поставщика членства asp.net - PullRequest
5 голосов
/ 14 апреля 2010

Я создаю собственный провайдер членства для моего приложения asp.net. Я также создал отдельный класс «DBConnect», который обеспечивает функциональные возможности базы данных, такие как выполнение оператора SQL, выполнение SP, выполнение SP или Query и возвращение SqlDataReader и т. Д. ...

Я создал экземпляр класса DBConnect в Session_Start файла Global.asax и сохранил его для сеанса. Позже, используя статический класс, я предоставляю функциональность базы данных во всем приложении, используя один и тот же сеанс. Короче говоря, я предоставляю единую точку для всех операций базы данных на любой странице asp.net.

Я знаю, что могу написать свой собственный код для подключения / отключения базы данных и выполнения SP внутри методов, которые мне нужно переопределить. Пожалуйста, посмотрите на код ниже -

public class SGI_MembershipProvider : MembershipProvider
{

......

    public override bool ChangePassword(string username, string oldPassword, string newPassword)
    {
        if (!ValidateUser(username, oldPassword))
            return false;

        ValidatePasswordEventArgs args = new ValidatePasswordEventArgs(username, newPassword, true);

        OnValidatingPassword(args);

        if (args.Cancel)
        {
            if (args.FailureInformation != null)
            {
                throw args.FailureInformation;
            }
            else
            {
                throw new Exception("Change password canceled due to new password    validation failure.");
            }
        }

.....        

//Database connectivity and code execution to change password.

}

....

}

МОЯ ПРОБЛЕМА - Теперь мне нужно выполнить часть базы данных во всех этих переопределенных методах из той же точки базы данных, как описано выше. То есть я должен передать экземпляр DBConnect, существующий в сеансе, этому классу, чтобы я мог получить доступ к методам.

Может ли кто-нибудь предоставить решение по этому вопросу. Там могут быть некоторые лучшие методы, которые я не знаю об этом. Подход, который я использую, может быть неправильным. Ваши предложения всегда приветствуются.

Спасибо, что поделились своим драгоценным временем.

Ответы [ 2 ]

4 голосов
/ 14 апреля 2010

Понимание жизненного цикла поставщика членства поможет прояснить ситуацию.

Экземпляр поставщика членства запускается при запуске приложения и остается активным в течение всего жизненного цикла приложения AppDomain, что на практике соответствует жизненному циклу приложения. например Если по какой-либо причине AppDomain зацикливается, приложение удаляется и запускается новый экземпляр. Новый экземпляр зарегистрированного поставщика членства запускается при первом использовании.

Вам нужно либо создать экземпляр своего класса доступа к данным в реализации вашего участника-провайдера, либо получить доступ к статическим методам из в вашего провайдера. Я предпочитаю использовать экземпляр.

Отделение провайдера членства от доступа к данным путем создания синглтонов или сохранения их в приложении - это, на мой взгляд, хакерство, которое приведет лишь к боли, печали, утраченному сну и доверию среди ваших сверстников.

Приветствия и удачи.

3 голосов
/ 14 апреля 2010

Не держите отдельный экземпляр класса DBConnect в сеансе, вы в конечном итоге создадите класс для каждого пользователя! Это серьезно повлияет на масштабируемость.

Вы можете сделать одно из следующих действий:

  • Поместить класс в состояние приложения
  • Использовать шаблон синглтона
  • Сделать класс и все методы в классе статическими.

Моя рекомендация - перейти к номеру 3. Обычно вам не нужно создавать экземпляр класса, который выполняет операции с базой данных, например

public static class DBConnect
{
  public static ChangePassword(string userId, string password)
  {
    //Implementation here
  }
}

Тогда вы можете просто вызвать этот код у своего провайдера, не создавая экземпляр:

DBConnect.ChangePassword(x,y);
...