Я - только вновь прибывший на ASP.NET MVC и не уверен, как достигнуть определенной задачи "правильный путь".
По существу я храню зарегистрированный идентификатор пользователя в HttpContext. Пользователь. Идентификационные данные и записали EnhancedAuthorizeAttribute
выполнить некоторую пользовательскую авторизацию.
В переопределенном OnAuthorization
метод, моя модель предметной области поражает базу данных, чтобы гарантировать, что текущий идентификатор пользователя может получить доступ к переданному в routeValue "BatchCode". Прототип:
ReviewGroup GetReviewGroupFromBatchCode(string batchCode);
Это возвратит пустой указатель, если пользователь не может получить доступ к ReviewGroup, и OnAuthorization затем запрещает доступа.
Теперь, я знаю, что украшенный метод действия будет только выполняться, если OnAuthorization передаст, но я не хочу поражать базу данных во второй раз для получения ReviewGroup снова.
Я думаю о хранении ReviewGroup в HttpContext.Items["reviewGroup"]
и доступ к этому от контроллера в данный момент.
Действительно ли это - выполнимое решение или является мной на неправильном пути?
Спасибо!
Если вы не сделаете ОЧЕНЬ большой выбор из ReviewGroup
или у вас огромная база данных, то второе попадание в базу данных не будет слишком большой проблемой. Современные базы данных очень эффективны при выборе, особенно с правильно проиндексированными таблицами.
По моему опыту,это лучший способ авторизации и метод, аналогичный тому, как я санкционировал конкретные действия в своих приложениях.
Короче говоря, я бы совсем не беспокоился о втором попадании в базу данных.
HttpContext.Items активен только на время запроса. Если вы хотите сохранить его в течение более длительного времени, вы должны поместить его в
а) сеанс - хорошо
б) профиль - не вижу преимущества
в) cookie - не рекомендуется
г) нажмите база данных каждый раз - должно быть в порядке
Сохранить его в filterContext.RouteData.DataTokens?
В качестве альтернативы, один из лучших и самых простых способов избежать попадания в базу данных - это кэширование. Получите его, вставьте в тайник. Если он снова понадобится, он уже находится в памяти, и обращение к БД не требуется. В противном случае, когда кеш выходит за пределы области видимости, объект тоже.