Я создаю пользовательского поставщика членства для своего приложения 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, существующего на сессии к этому классу, так, чтобы я мог получить доступ к методам.
Мог любой предоставлять решение на этом. Могли бы быть некоторые лучшие методы, я не знаю об этом. Подход, который я использую, мог бы быть неправильным. Ваши предложения всегда приветствуются.
Спасибо за совместное использование Вашего бесценного времени.
Понимание жизненного цикла поставщика членства поможет прояснить это.
Экземпляр поставщика членства запускается при запуске приложения и остается активным в течение всего времени существования домена приложения AppDomain, что на практике соответствует жизненному циклу приложения. например Если по какой-то причине AppDomain циклически повторяется, приложение удаляется и запускается новый экземпляр. Новый экземпляр зарегистрированного поставщика членства запускается при первом использовании.
Вам необходимо либо создать экземпляр вашего класса доступа к данным в реализации вашего поставщика членства, либо получить доступ к статическим методам из внутри вашего провайдера. Я предпочитаю использовать экземпляр.
Отделение поставщика членства от его доступа к данным путем создания синглтонов или вложения его в приложение, на мой взгляд, является взломом и ни к чему не приведет, кроме боли, печали, потери сна и доверия среди ваших коллег.
Ура и удачи.
Не храните отдельный экземпляр класса DBConnect в сеансе, вы в конечном итоге создадите класс для каждого пользователя! Это серьезно повлияет на масштабируемость.
Вы можете выполнить одно из следующих действий:
Я рекомендую выбрать номер 3. Обычно вам не нужно создавать экземпляр класса, который выполняет грубые операции с базой данных, например
public static class DBConnect
{
public static ChangePassword(string userId, string password)
{
//Implementation here
}
}
Затем вы можете просто вызвать этот код в своем провайдере, не создавая экземпляр:
DBConnect.ChangePassword(x,y);