Обеспечение пользовательской функциональности базы данных пользовательскому поставщику членства asp.net

Я создаю пользовательского поставщика членства для своего приложения asp.net. Я также создал отдельный класс "DBConnect", который обеспечивает функциональность базы данных, такую как Выполнение SQL-оператора, Выполнение SPS, Выполнение SPS или Запроса и возврата SqlDataReader и так далее...

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

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

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, существующего на сессии к этому классу, так, чтобы я мог получить доступ к методам.

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

Спасибо за совместное использование Вашего бесценного времени.

5
задан David Murdoch 8 February 2011 в 20:48
поделиться

2 ответа

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

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

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

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

Ура и удачи.

4
ответ дан 14 December 2019 в 08:46
поделиться

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

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

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

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

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

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

DBConnect.ChangePassword(x,y);
3
ответ дан 14 December 2019 в 08:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: