Статическая переменная, которая существует только в контексте текущей исполняемой страницы? - PullRequest
2 голосов
/ 27 августа 2011

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

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

Как способ борьбы с этим, я сделал следующее:

public static class Core
{
    private static PatientRow Patient;
    public static PatientRow GetCurrentPatient()
    {
        if (Patient == null && HttpContext.Current.User.Identity.IsAuthenticated && HttpContext.Current.User.IsInRole("Patient"))
        {
            using (PatientModel model = new PatientModel())
            {
                Patient = model.Find<PatientRow>(User.CurrentUser.UserID);
            }
        }
        return Patient;
    }
}

Как вы можете видеть, я проверяю, является ли закрытая статическая переменная Patient нулевой, если да, то уходит и получает ее. В следующий раз, когда я вызову GetCurrentPatient, так как Patient уже заполнен, я просто сохранил свой вызов в базе данных и т. Д.

Теперь возникает проблема ... Как мы все знаем, это будет означать, что каждый раз, когда я вызываю GetCurrentPatient, независимо от того, кто просматривает сайт, они получат последнее (или первое) установленное значение.

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

Есть предложения?

Приветствия

Редактировать: До прочтения ответа Дарина я реализовал следующее.

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

Я внесу изменения в свой текущий код, чтобы он соответствовал коду Дарина. Очень ценил Дарина!

1 Ответ

4 голосов
/ 27 августа 2011

Вы можете хранить его в сумке HttpContext.Current.Items. Он будет доступен во время всего выполнения HTTP-запроса и, очевидно, ограничен только текущим пользователем. Так что если вы вызываете метод GetCurrentPatient несколько раз из нескольких мест в рамках одного запроса, он попадет в базу данных только один раз. Если вам нужно сохранить эту информацию для более чем запроса, вам нужно использовать сеанс.

Например:

public static class Core
{
    public static PatientRow GetCurrentPatient()
    {
        var patient = HttpContext.Current.Items["patient"];
        if (patient == null && HttpContext.Current.User.Identity.IsAuthenticated && HttpContext.Current.User.IsInRole("Patient"))
        {
            using (PatientModel model = new PatientModel())
            {
                patient = model.Find<PatientRow>(User.CurrentUser.UserID);
                HttpContext.Current.Items["patient"] = patient;
            }
        }
        return patient;
    }
}

Не храните ничего в статических полях, особенно если эта информация связана только с текущим пользователем.

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