Как избавиться от пользовательского объекта из провайдера пользовательского членства - PullRequest
3 голосов
/ 16 апреля 2010

Я создал свой пользовательский MembershipProvider. Я использовал экземпляр класса DBConnect в этом провайдере для обработки функций базы данных. Пожалуйста, посмотрите на код ниже:

public class SGIMembershipProvider : MembershipProvider
{
    #region "[ Property Variables ]"
    private int newPasswordLength = 8;
    private string connectionString;
    private string applicationName;
    private bool enablePasswordReset;
    private bool enablePasswordRetrieval;
    private bool requiresQuestionAndAnswer;
    private bool requiresUniqueEmail;
    private int maxInvalidPasswordAttempts;
    private int passwordAttemptWindow;
    private MembershipPasswordFormat passwordFormat;
    private int minRequiredNonAlphanumericCharacters;
    private int minRequiredPasswordLength;
    private string passwordStrengthRegularExpression;
    private MachineKeySection machineKey; 

    **private DBConnect dbConn;**
    #endregion

.......

    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.");
            }
        }
        SqlParameter[] p = new SqlParameter[3];
        p[0] = new SqlParameter("@applicationName", applicationName);
        p[1] = new SqlParameter("@username", username);
        p[2] = new SqlParameter("@password", EncodePassword(newPassword));

        bool retval = **dbConn.ExecuteSP("User_ChangePassword", p);**
        return retval;
    } //ChangePassword


    public override void Initialize(string name, NameValueCollection config)
    {
        if (config == null)
        {
            throw new ArgumentNullException("config");
        }

        ......

        ConnectionStringSettings ConnectionStringSettings = ConfigurationManager.ConnectionStrings[config["connectionStringName"]];

        if ((ConnectionStringSettings == null) || (ConnectionStringSettings.ConnectionString.Trim() == String.Empty))
        {
            throw new ProviderException("Connection string cannot be blank.");
        }

        connectionString = ConnectionStringSettings.ConnectionString;

        **dbConn = new DBConnect(connectionString);
        dbConn.ConnectToDB();**

        ......

} //Initialize

......

} // SGIMembershipProvider 

Я создал экземпляр объекта dbConn в событии Initialize().

Моя проблема в том, как я могу избавиться от этого объекта, если объект SGIMembershipProvider удален.

Я знаю, что GC сделает все это для меня, но мне нужно явно избавиться от этого объекта. Даже я пытался переопределить Finalize(), но такого переопределенного метода не существует. Я также пытался создать деструктор для SGIMembershipProvider.

Может кто-нибудь предоставить мне решение.

Ответы [ 2 ]

2 голосов
/ 16 апреля 2010

Из того, что я вижу, MembershipProvider не IDisposable (и не ProviderBase), поэтому мы действительно говорим о сборе мусора, а не утилизации , Вы должны иметь возможность добавить свой собственный финализатор (~SGIMembershipProvider() {}), но он должен только общаться с неуправляемыми объектами - другие управляемые объекты будут также , в конце концов, должен быть собран (и должен обрабатывать свои неуправляемые объекты, если таковые имеются - что редко).

0 голосов
/ 07 февраля 2011

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

Причина, по которой я рекомендую этот подход, заключается в том, что вы не экономите ресурсы, привязываясь к этому объекту соединения. Пул соединений будет обрабатывать повторное использование существующих открытых соединений для вас. Пул соединений работает на уровне неуправляемого кода. Когда вы закрываете / удаляете объект управляемого соединения, он не обязательно закрывает физическое неуправляемое соединение, он просто возвращает соединение в пул соединений. Неуправляемый код, управляющий пулом, затем определит, что с ним делать (закройте его, оставьте его открытым некоторое время, передайте его другому процессу, который в этом нуждается). Аналогично, когда вы создаете управляемое соединение, вы не обязательно создаете новое соединение с нуля, вы можете просто повторно использовать существующее.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...